一个表的外键一定是另一个表的主键
DROP TABLE IF EXISTS nminfo;
DROP TABLE IF EXISTS nm;
CREATE TABLE nm(
id VARCHAR(10) NOT NULL,
name VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
CREATE TABLE nminfo(
id VARCHAR(10) NOT NULL,
cource VARCHAR(10) DEFAULT NULL,
score INT(11) DEFAULT NULL,
KEY id (id),
CONSTRAINT id FOREIGN KEY (id) REFERENCES nm (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
多个外键:
DROP TABLE IF EXISTS empInfo;
DROP TABLE IF EXISTS empName;
DROP TABLE IF EXISTS empCource;
CREATE TABLE empName(
name_id VARCHAR(10) NOT NULL,
name_desc VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (name_id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
CREATE TABLE empCource(
cource_id VARCHAR(10) NOT NULL,
cource_desc VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (cource_id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
CREATE TABLE empInfo(
name_id VARCHAR(10) NOT NULL,
cource_id VARCHAR(10) NOT NULL,
score INT(11) DEFAULT 0,
CONSTRAINT name FOREIGN KEY (name_id) REFERENCES empName(name_id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT cource FOREIGN KEY (cource_id) REFERENCES empCource(cource_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
一个外键多个字段:
CREATE TABLE stu(
name_id VARCHAR(10),
class_id VARCHAR(10),
Iddesc VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (name_id,class_id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
CREATE TABLE stu_score(
name_id VARCHAR(10),
class_id VARCHAR(10),
score_num INT,
CONSTRAINT classname FOREIGN KEY (name_id,class_id) REFERENCES stu(name_id,class_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
修改外键(先删除再创建):
ALTER TABLE empInfo DROP FOREIGN KEY name;
ALTER TABLE empInfo ADD CONSTRAINT name FOREIGN KEY (name_id) REFERENCES empName(name_id) ON DELETE NO ACTION ON UPDATE NO ACTION;
显示键:
SHOW KEYS FROM empInfo;
Mysql中的 的 Cascade ,NO ACTION ,Restrict ,SET NULL
外键约束对子表的含义:
如果在父表中找不到候选键,则不允许在子表上进行insert/update
外键约束对父表的含义:
在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下
. cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用
. set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null
On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用
. No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
这个是ANSI SQL-92标准,从mysql4.0.8开始支持
. Restrict方式
同no action, 都是立即检查外键约束
. Set default方式
解析器认识这个action,但Innodb不能识别,不知道是什么意思...
注意:trigger不会受外键cascade行为的影响,即不会解发trigger
浙公网安备 33010602011771号