精华内容
下载资源
问答
  • 我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES 主键列1 [,主键列2,…]举例:...

    5ee9b49e1eb32493.jpg

    我们可以在创建表时设置外键约束。

    在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]

    REFERENCES 主键列1 [,主键列2,…]

    举例:

    现在在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下图所示:

    1592374540945822.png

    创建 tb_dept1 的 SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_dept1

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(22) NOT NULL,

    -> location VARCHAR(50)

    -> );

    Query OK, 0 rows affected (0.37 sec)

    创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 tb_dept1 的主键 id,SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_emp6

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> CONSTRAINT fk_emp_dept1

    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)

    -> );

    Query OK, 0 rows affected (0.37 sec)

    mysql> DESC tb_emp6;

    +--------+-------------+------+-----+---------+-------+

    | Field | Type | Null | Key | Default | Extra |

    +--------+-------------+------+-----+---------+-------+

    | id | int(11) | NO | PRI | NULL | |

    | name | varchar(25) | YES | | NULL | |

    | deptId | int(11) | YES | MUL | NULL | |

    | salary | float | YES | | NULL | |

    +--------+-------------+------+-----+---------+-------+

    4 rows in set (1.33 sec)

    以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

    注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 INT 类型,或者都是 CHAR 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can't create table”错误。

    展开全文
  • 外键是用来实现参照完整性,不同的外键约束方式将可以使两张表紧密结合起来,特别是修改或者删除级联操作将使得日常维护工作更加轻松。外键主要用来保证数据完整性和一致性两个表必须是InnoDB表,MyISAM表...

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性

    两个表必须是InnoDB表,MyISAM表暂时不支持外键

    外键列必须建立了索引,MySQL4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;

    外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

    创建外键语法:

    代码如下 复制代码[CONSTRAINT [symbol]] FOREIGN KEY

    [index_name](index_col_name, ...)REFERENCEStbl_name (index_col_name,...)[ON DELETE reference_option]

    [ON UPDATE reference_option]reference_option:RESTRICT | CASCADE | SET NULL |NO ACTION

    如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ONUPDATE,默认的动作为RESTRICT:1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATECANSCADE都被InnoDB所支持。2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SETNULL都被InnoDB所支持。3. NO ACTION: InnoDB拒绝删除或者更新父表。4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。5. SET DEFAULT: InnoDB目前不支持。

    外键约束使用最多的两种情况:1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

    前一种情况,在外键定义中,我们使用ONUPDATE CASCADE ON DELETE RESTRICT;

    后一种情况,可以使用ONUPDATE CASCADE ON DELETE CASCADE。

    使用案例:

    (1)创建表:

    代码如下 复制代码--

    --http://www.111cn.net 原创--

    CREATE TABLE IF NOT EXISTS`article` (

    `id`int(11) NOT NULLAUTO_INCREMENT,

    `category_id`int(11) NOT NULL,

    `name`char(16) NOT NULL,PRIMARY KEY(`id`),KEY`fk_1` (`category_id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;INSERT INTO `article` (`id`, `category_id`, `name`) VALUES(1, 1, '文章1');CREATE TABLE IF NOT EXISTS`category` (

    `id`int(11) NOT NULLAUTO_INCREMENT,

    `name`char(16) NOT NULL,PRIMARY KEY(`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;INSERT INTO `category` (`id`, `name`) VALUES(1, '分类1');

    创建外键约束:

    代码如下 复制代码ALTER TABLE`article`ADD CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES`category` (`id`);

    (2)删除主表category中数据:delete FROM `category` WHERE id=1,会报错:

    #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES`category` (`id`))

    (3)从表article中,添加不存在的category_id:insert into article(category_id,name) values(2,'分类2') 会报错:

    #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES`category` (`id`))

    (4)更改更新删除约束

    代码如下 复制代码--删除外键

    ALTER TABLE article DROP FOREIGN KEYfk_1--添加外键

    ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY( `category_id` )REFERENCES`category` ( `id` )ON DELETE CASCADE ON UPDATE CASCADE此时如下操作:

    代码如下 复制代码--此时article中的记录也会被删除

    delete from category where id=1;--此时article中的category_id也会被更新成3

    UPDATE `test`.`category` SET `id` = '3' WHERE `category`.`id` =2;

    展开全文
  • 在MySQL中,InnoDB引擎类型表支持了外键约束。外键使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后版本有可能支持,但至少目前不支持);2.外键列必须建立了索引,MySQL 4.1.2以后版本在...

    在MySQL中,InnoDB引擎类型的表支持了外键约束。

    外键的使用条件:

    1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);

    2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;

    3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

    外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

    外键的定义语法:

    [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, …)

    REFERENCES tbl_name (index_col_name, …)

    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

    该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。

    ON DELETE、ON UPDATE表示事件触发限制,可设参数:

    RESTRICT(限制外表中的外键改动)

    CASCADE(跟随外键改动)

    SET NULL(设空值)

    SET DEFAULT(设默认值)

    NO ACTION(无动作,默认的)

    展开全文
  • 我正在使用Workbench创建数据库模型并创建下表:CREATE TABLE IF NOT EXISTS `Database`.`table1` (`idtable1` INT NOT NULL ,`uniquecolumn` INT NOT NULL ,PRIMARY KEY (`idtable1`) ,UNIQUE INDEX `UniqueIndex` ...

    我正在使用Workbench创建数据库模型并创建下表:

    CREATE TABLE IF NOT EXISTS `Database`.`table1` (

    `idtable1` INT NOT NULL ,

    `uniquecolumn` INT NOT NULL ,

    PRIMARY KEY (`idtable1`) ,

    UNIQUE INDEX `UniqueIndex` (`uniquecolumn` ASC) )

    ENGINE = InnoDB

    它有一个主键,在我的第二列上有一个唯一键.

    当我在它们上创建外键约束时,Workbench会自动添加两个索引:

    CREATE TABLE IF NOT EXISTS `Database`.`table1` (

    `idtable1` INT NOT NULL ,

    `uniquecolumn` INT NOT NULL ,

    PRIMARY KEY (`idtable1`) ,

    UNIQUE INDEX `UniqueIndex` (`uniquecolumn` ASC) ,

    INDEX `FKOne` (`idtable1` ASC) , //here

    INDEX `FKTwo` (`uniquecolumn` ASC) , //(I don't want this!)

    CONSTRAINT `FKOne`

    FOREIGN KEY (`idtable1` )

    REFERENCES `Database`.`table2` (`idtable2` )

    ON DELETE CASCADE

    ON UPDATE CASCADE,

    CONSTRAINT `FKTwo`

    FOREIGN KEY (`uniquecolumn` )

    REFERENCES `Database`.`table2` (`idtable2` )

    ON DELETE CASCADE

    ON UPDATE CASCADE)

    ENGINE = InnoDB

    (以上是将外键添加到我的模型后的正向设计脚本)

    我现在有四个索引.

    这就是MySQL参考手册所说的:

    In the referencing table, there must be an index where the foreign key

    columns are listed as the first columns in the same order. Such an

    index is created on the referencing table automatically if it does not

    exist.

    所以我理解不需要创建索引FKOne和FKTwo,因为在相同的列上已经有相同顺序的主键和唯一索引.然而,MySQL Workbench不允许我删除索引FKOne和FKTwo.我想我应该能够做到这一点:

    CREATE TABLE IF NOT EXISTS `Database`.`table1` (

    `idtable1` INT NOT NULL ,

    `uniquecolumn` INT NOT NULL ,

    PRIMARY KEY (`idtable1`) ,

    UNIQUE INDEX `UniqueIndex` (`uniquecolumn` ASC) ,

    CONSTRAINT `FKOne`

    FOREIGN KEY (`idtable1` )

    REFERENCES `Database`.`table2` (`idtable2` )

    ON DELETE CASCADE

    ON UPDATE CASCADE,

    CONSTRAINT `FKTwo`

    FOREIGN KEY (`uniquecolumn` )

    REFERENCES `Database`.`table2` (`idtable2` )

    ON DELETE CASCADE

    ON UPDATE CASCADE)

    ENGINE = InnoDB

    我对吗?这段代码有用吗?有没有办法用Workbench做到这一点? (除了在前向工程之前的最后一刻删除这两行).

    或者MySQL可能足够智能,不会创建完全冗余的索引,我不必担心它……?

    最佳答案 (我假设这是在定义模型时.)

    请参阅Bug 53277,其中我提到了以下模糊的解决方法:

    您可以从外键及其要删除的相应生成索引开始.确保密钥(至少暂时)在单个非唯一列上.在“索引”选项卡中,将“类型”更改为“UNIQUE”.然后转到Columns选项卡,现在检查UQ,并取消选中它.消除了不需要的索引!

    展开全文
  • 一、本次数据库中有student,course,sc表,其设置情况-- 创建course表CREATE TABLE `course` (`cno` varchar(3) NOT NULL,`cname` varchar(12) DEFAULT NULL,`lhour` int(11) DEFAULT NULL,`credit` int(11) ...
  • 语法 列级进行设置 ...外键约束也被称为主次表关系。 注意: 设置外键约束时,主表字段必须是主键。 主从表中相应字段必须是同一种数据类型。 从表中外键字段值必须来自主表中
  • 一、外键创建语法一:后续添加方法alter table 表名 add constraint 约束名 foreign key(当前表中约束的字段) references 主表表名(要约束的字段名);alter table student add constraint fk_class_student foreign...
  • 我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES 主键列1 [,主键列2,…]举例:...
  • 3、添加外键的语法:有两种方式:方式一:在创建表的时候进行添加方式二:表已经创建好了,继续修改表的结构来添加外键【方式一】在创建表的时候进行添加[CONSTRAINTsymbol]FOREIGNKEY[id](从表的字段1)...
  • 删除表的外键约束

    2020-05-13 19:04:03
    让我们先来看看删除外键约束的语法规则。 语法规则为: ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名; 。 我们先建立了一个主表country, 然后建立一个有外键约束的子表Mall_products2,让它的键country_id作为...
  • 外键约束

    2014-08-01 12:59:21
    外键约束 外键约束是确保表中数据正确性一个手段,它经常与主键约束一起使用。外键约束是用来约束两个表中数据一致性。... 1、 在创建表时为其设这外键约束语法如下: “ALTER TA...
  • 主键约束创建表时,在列类型后页面可以用PRIMARY KEY关键字指定列类型为主键,当指定列类型为主键后,列被强制为NOT NULL,并且列中每行被强制为一个唯一值。 创建主键建议方法:在列或者表级别使用...
  • 如何删除表的外键约束

    千次阅读 2020-08-02 14:43:16
    让我们先来看看删除外键约束的语法规则。 语法规则为: ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名; 。 举个例子: 我们先建立了一个主表country,表结构如下图所示: 然后建立一个有外键约束的子表Mall_...
  • 我们可以在创建表时设置外键约束。在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:...创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 t...
  • MySQL外键约束

    2015-08-16 16:45:07
    InnoDB类型表有一个其他存储引擎不支持的特性——外键约束。 当B表的外键关联到A表的主键时(表B是父表A表的子表),如果...创建一个外键约束的语法是: FOREIGN KEY(item_name)REFERENCES table (column) tab
  • 外键约束1.简介外键表示一个表中一个字段被另外一个表中字段应用.外键对相关表中数据造成了限制,使MySQL 能够保证参照完整性.在MySQL 中,InnoDB 存储引擎支持外键.在一张表中,可以存在多个外键.外键的创建可以...
  • 对MySQL中的外键约束从基础知识开始,说明了创建外键约束的原则,语法及特性,用案例的方式对外键约束进行解说。
  • mysql外键约束

    2016-07-24 16:29:52
    外键约束 维护一个学生与班级关系   外键定义:外键就是指是一个表某个字段值指向另外一个表主键。   增加外键 在一张表中创建一个字段,该字段指向另外一张表主键。通过一定约束语句来指明...
  • 创建的语法我在官方的文档中看到了这样的CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name(create_definition,...)1. 上面语法中的create definition可以为是col_name column_definition,对应下面列举的第一个...
  • mysql 设置外键约束(foreign key)

    万次阅读 2015-02-06 13:43:13
    如果需要对多个列组合创建外键约束,或者需要为外键约束指定名字则必须使用表级约束语法。  使用列级约束语法建立外键约束直接使用references关键字,references指定该列参照哪个主表,以及参照主表哪一列。...
  • MySQL外键约束(FOREIGN KEY)用来在两个表数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。 1、在创建表时设置外键约束 在数据表中创建外键使用 FOREIGN KEY 关键字 语法 [CONSTRAINT <...
  • 在MySQL中,InnoDB引擎类型表支持了外键约束。外键使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后版本有可能支持,但至少目前不支持);2.外键列必须建立了索引,MySQL 4.1.2以后版本...
  • 【关键字 】paimary key 【代表主键】,not null【 非空 】foreign key【 代表外键】 (zhu) references【引用】 zhu ( code)[ 建立外键关系 ]auto_increment【自动递增】注释语法:用#注释、创建表create table test...
  • 添加外键约束时需要注意地方

    千次阅读 2014-09-25 19:45:21
    添加外键约束的时候,报了这么一个错误“ORA-02270: 此列列表的唯一关键字或主键不匹配”。如下图: 检查了好几遍都没有发现语法错误。最后根据Oracle的提示还是找到了原因:被引用的那个外键,必须是添加了...
  • 如果需要对多个列组合创建外键约束,或者需要为外键约束指定名字则必须使用表级约束语法。 使用列级约束语法建立外键约束直接使用references关键字,references指定该列参照哪个主表,以及参照主表哪一列。如下...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 315
精华内容 126
热门标签
关键字:

创建外键约束的语法