精华内容
下载资源
问答
  • 外键必须是另一个表主键

    千次阅读 2019-03-01 14:48:49
    不一定是主键,但必须是唯一性索引。 主键约束和唯一性约束都是唯一性索引。 FOREIGN KEY 约束 ...在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两之间创建了链接。这...

    不一定是主键,但必须是唯一性索引。

    主键约束和唯一性约束都是唯一性索引。

     

     

    FOREIGN KEY 约束

    SQL Server 2008

    其他版本

    外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。当创建或修改表时可通过定义 FOREIGN KEY 约束来创建外键。

    在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。

    例如,因为销售订单和销售人员之间存在一种逻辑关系,所以 AdventureWorks 数据库中的 Sales.SalesOrderHeader 表含有一个指向Sales.SalesPerson 表的链接。SalesOrderHeader 表中的 SalesPersonID 列与 SalesPerson 表中的主键列相对应。SalesOrderHeader 表中的SalesPersonID 列是指向 SalesPerson 表的外键。

    SalesOrderHeader.SalesPersonID 为外键。

    FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证。若要确保验证了组合 FOREIGN KEY 约束的所有值,请将所有参与列指定为 NOT NULL。

    注意 注意

    FOREIGN KEY 约束可以引用同一数据库的表中的列或同一表中的列。这些称为“自引用”表。例如,请考虑包含三列的一个雇员表:employee_numberemployee_name 和 manager_employee_number。由于经理本身也是雇员,所以从manager_employee_number 列到 employee_number 列存在外键关系。

     

    引用完整性

    尽管 FOREIGN KEY 约束的主要目的是控制可以存储在外键表中的数据,但它还可以控制对主键表中数据的更改。例如,如果在 Sales.SalesPerson表中删除一个销售人员行,而这个销售人员的 ID 由 Sales.SalesOrderHeader 表中的销售订单使用,则这两个表之间关联的完整性将被破坏;SalesOrderHeader 表中删除的销售人员的销售订单因为与 SalesPerson 表中的数据没有链接而变得孤立了。

    FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改将无法实现,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束中的值相对应,则该操作将失败。若要成功更改或删除 FOREIGN KEY 约束的行,必须先在外键表中删除或更改外键数据,这将把外键链接到不同的主键数据上去。

     

    对 FOREIGN KEY 约束建立索引

    由于以下原因,对外键创建索引通常是有用的:

    • 对 PRIMARY KEY 约束的更改可由相关表中的 FOREIGN KEY 约束检查。

    • 当在查询中组合相关表中的数据时,经常在联接条件中使用外键列,方法是将一个表的 FOREIGN KEY 约束中的列与另一个表中的主键列或唯一键列匹配。索引使 数据库引擎可以在外键表中快速查找相关数据。但是,创建此索引并不是必需的。即使没有对两个相关表定义 PRIMARY KEY 或 FOREIGN KEY 约束,也可以对来自这两个表中的数据进行组合,但两个表间的外键关系说明已用其键作为条件对其进行了优化,以便组合到查询中。有关在联接中使用 FOREIGN KEY 约束的详细信息,请参阅联接基础知识查询类型和索引

     

    表中的 FOREIGN KEY 约束数

    SQL Server 对一个表可以包含的 FOREIGN KEY 约束(引用其他表)数没有预定义限制,对引用特定表的其他表所拥有的 FOREIGN KEY 约束数也没有预定义的限制。但是,实际的 FOREIGN KEY 约束数会受到硬件配置以及数据库和应用程序的设计的限制。建议表中包含的 FOREIGN KEY 约束不要超过 253 个,并且引用该表的 FOREIGN KEY 约束也不要超过 253 个。在设计数据库和应用程序时应考虑强制 FOREIGN KEY 约束的开销。

     

    请参阅

    参考

    CREATE TABLE (Transact-SQL)

    ALTER TABLE (Transact-SQL)

    DROP TABLE (Transact-SQL)

    概念

    创建和修改 FOREIGN KEY 约束

    索引

    展开全文
  • CREATE TABLE orderitems ( order_num int(11) NOT NULL, order_item int(11) NOT NULL, prod_id char(10) NOT NULL, quantity int(11) NOT NULL, item_price decimal(8,2) NOT NULL, PRIMARY KEY (order_num,orde.....

    在这里插入图片描述

    在这里插入图片描述

    CREATE TABLE orderitems (
    order_num int(11) NOT NULL,
    order_item int(11) NOT NULL,
    prod_id char(10) NOT NULL,
    quantity int(11) NOT NULL,
    item_price decimal(8,2) NOT NULL,
    PRIMARY KEY (order_num,order_item),
    KEY FK_OrderItems_Products (prod_id),
    CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES orders (order_num),
    CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES products (prod_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    在这里插入图片描述

    展开全文
  • MySQL表必须有主键吗?

    千次阅读 2020-11-04 19:06:27
    一般情况下,我们所使用的储存引擎是innodb,那今天我就基于存储引擎是innodb的情况来讨论下是否必须有主键 聚簇索引 提到innodb就先介绍下聚簇索引的概念,聚集索引定义了中数据的物理存储顺序。如何理解聚集...

    前言:

    一般情况下,我们所使用的储存引擎是innodb,那今天我就基于存储引擎是innodb的情况来讨论下表是否必须有主键

    聚簇索引

    提到innodb就先介绍下聚簇索引的概念,聚集索引定义了表中数据的物理存储顺序。如何理解聚集索引呢,好比一个电话本,比如一个电话本是按照姓氏排序,并且电话号码紧跟着后面。因为聚集索引决定了表中数据的物理存储顺序,那么一个表则有且只有一个聚集索引。一个聚集索引可以包含多个列。好比一个电话本是基于名字,姓氏同时排序。

    I

    nnodb选择一个聚集索引的过程

    对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则

    如果一个主键被定义了,那么这个主键就是作为聚集索引

    如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引

    如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

    总结:

    在MySQL中,InnoDB存储引擎总是在没有显式指定的情况下创建主键,从而生成一个额外的列,您无法访问它。所以最好的情况下还是为innodb为存储引擎的数据表指定主键比较好

    展开全文
  • 现有A1、B1两张,表字段相同,都id字段的自增主键,需要将B1中的部分数据导入到A1中,SQL如下: INSERT INTO DB.A1 (a,b,c) select a,b,c from DB.B1 where date>='2018-11-01' and date<='2018-12-24...

    现有A1、B1两张表,表字段相同,都有id字段的自增主键,需要将B1表中的部分数据导入到A1表中,SQL如下:

    INSERT INTO DB.A1 (a,b,c) select a,b,c from DB.B1 where date>='2018-11-01' and date<='2018-12-24'
    

    注意:

    • 如果导入时直接采用INSERT INTO DB.A1 select * from DB.B1这种会报ERROR 1062 (23000): Duplicate entry '15' for key 'PRIMARY'错,想想也是A1、B1两张表含有相同的主键值,使得其不唯一。采用不查主键的方式导入,令其自增即可。
    展开全文
  • 如何给一个数据库添加主键

    千次阅读 2020-12-03 09:46:06
    (一张表有且只能有一个主键主键具有唯一性。) CREATE TABLE tb ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(20) ) 2.在创建的时候在所有字段后面使用primary key(主键字段列表)来创建主键(如果多...
  • 如图:![图片说明]...怎么在这个表中设置teachers162里的Teacher_ID 为外键? ![图片说明](https://img-ask.csdn.net/upload/201506/09/1433856532_901555.png)
  • 1、mapper层里的方法上添加注解:实体类属性:cExperimentaltaskid(id)表字段:c_experimentaltaskid(主键id字段)@Options(useGeneratedKeys = true, keyProperty = "...)2、在第一个表添加成功后调用...
  • 一张可以多少个主键

    万次阅读 多人点赞 2015-10-21 10:20:28
    1、数据库的每张只能有一个主键,不可能多个主键。 2、所谓的一张多个主键,我们称之为联合主键。  注:联合主键:就是用多个字段一起作为一张主键。 3、主键主键的作用是保证数据的唯一性和完整性...
  • SELECT TF_SCHOOL_DORMITORY_INFO.*, tsi.STAFF_NAME “ceoName”, ts_staff_info.STAFF_NAME AS “houseMasterName” FROM ( SELECT * FROM ts_staff_info ) tsi right join TF_SCHOOL_DORMITORY_INFO ON tsi.STAFF...
  • room中的id作为父主键,另外两个表中的r_id作为子的外键 并且给room的id设置了字段增加的属性。 通过SHOW CREATE TABLE room;可以读到当前AUTO_INCREMENT的值 问题在于: 对于room自增的id,如果说...
  • Oracle 查询一个表主键被哪些引用在数据库表格的制定过程中,时候会想要修改一个表格的主键,虽然这是极其不推荐的,因为主键应该在一开始就设计好,但像我这样的新手,难免会碰到要改动刚开始设计并不规范的...
  • 问:为什么InnoDB表必须有主键。并且推荐使用整型的自增主键: 1、如果设置了主键,那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也...
  • ![图片说明]...如图,3字段,但不没有主键,我希望查询出pid不等于1并且name不等于n2的记录,期望的结果如下: pid name value 1 n1 1 1 n3 1 2 n2 2 2 n4 3
  • 1、数据库的每张只能有一个主键,不可能多个主键。 2、所谓的一张多个主键,我们称之为联合主键。  注:联合主键:就是用多个字段一起作为一张主键。 3、主键主键的作用是保证数据的唯一性和完整性...
  • 一个表的外键关联到主主键约束或者unique约束都可以,不一定非要主键约束追问:也就是意思是只要能唯一标识一张中数据,就可以做外键?追答:嗯,但是不能是数据上控制的,必须两个约束之一才行
  • 如何设置多个主键
  • SQL 一个表中可不可以没有主键

    千次阅读 2019-03-14 13:53:00
    3)在中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。 4) 数据库自动按主键值的顺序显示中的记录。如果没有定义主键,则按输入记录的顺序显示中的记录。 主键不是非...
  • 1.创建测试【user:一个主键:id】 CREATE TABLE `test`.`Untitled` ( `id` int NOT NULL, `name` varchar(255) NULL, PRIMARY KEY (`id`) ); 2.查看索引 show index FROM user Table:名称 Non_...
  • Computer System Add comments 2010年5月6日更新: 只有真正懂得了这个道理的人, 才算真正理解了...在数据库设计中, 每一个表都应该有一个字段作为主键. 这个字段一般是自增整数字段, 或者某些数据库支持的自动
  • 方法插入完,执行方法二,此时方法二包主键冲突。方法二和方法处在不同事务中
  • 什么是一个表的外键 他和主键有什么区别吗/?主键:唯一标识中的所有行的一个列或一组列。主键不允许空值。不能存在具有相同的主键值的两个行,因此主键值总是唯一标识单个行。中可以不止一个键唯一标识...
  • 前几天在创建数据时,想偷个懒,使用一个序列给两个创建主键自增功能,结果。。。。。。情景:为宠物中心创建一个简单的数据库,要求如下:
  • 之间有一对多、多对多的关系,只要涉及到之间的关联们就会涉及到外键和主键 知识点:   那么怎么设置外键呢? demo: 现在两张,user(编号、姓名、职务、工种、部门)、kinds (工种、...
  • create table a( id varchar(20) not null primary key, name varchar(30) ); create table b( id varchar(20) not null primary key ); ...id varchar(20) not null primary key ...alter table b add constraint a_id ...
  • 主键关联而相关的两张中的行共享相同的主键值。这种方法的主要困难在于,确保被关联的  实例在保存对象时分配了相同的主键值。  第步:用xml映射主键关联  view plaincopy to clipboard...
  • ALTER TABLE `photo_feedbacks` ADD COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`id`);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482,796
精华内容 193,118
关键字:

一个表必须有一个主键