精华内容
下载资源
问答
  • 2021-02-01 02:46:07

    sql设置外键(设置外键的sql语句)

    2020-07-24 11:44:03

    共8个回答

    sql怎么设置外键

    创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只有主键没有外键时不行的。

    建外键的前提是此外键必须是另外一个表的主键。建外键的步骤:

    第一步、打开要建外键表的设计器,右击选择“关系”。

    第二步、然后弹出“外键关系”窗体,我们选择“添加”,然后点击“表和列规范”后面的小按钮。

    第三步、弹出另外一个窗体让我们选择主键表和列,记住要选择相同的,选好之后点击确定。

    第四步、展开INSERT和UPDATE规范,在更新规则和删除规则有四个选项,分别是“不执行任何操作”、“级联”、“设置为NULL”、“设置默认值”。

    默认的不执行任何操作。如果是“不执行任何操作”,当我们删除或更新主键表的数据时,会告诉用户不能执行删除或更新该操作。

    “级联”的意思是当我们删除或更新主键表的数据时,会删除或更新外键表中所涉及的相关数据的所有行。

    “设置Null”的意思是当我们删除或更新主键表的数据时,外键表中的外键列的值会设为Null,但前提是该列允许为空。

    “设置默认值”的意思是如果我们将外键列定义了默认值,当我们删除或更新主键表的数据时,外键表中的外键列的值设为定义的默认值。

    当然也可以用代码创建,在创建数据库表T——Card时只要加上一句代码就可以了。“Foreign key (studentNo) references T_Student(studentNo)"。如果已经创建了改表,那如何用代码实现了,这也很简单也就一句代码“ add constraint CMPKey(外键名)

    更多相关内容
  • 数据库中的外键

    千次阅读 2019-09-09 16:38:14
    便于理解外键 ,拿主键来作为对比,并行研究。 一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,...

    便于理解外键 ,拿主键来作为对比,并行研究。

    一、什么是主键、外键:

    关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
    比如
    学生表(学号,姓名,性别,班级)
    其中每个学生的学号是唯一的,学号就是一个主键
    课程表(课程编号,课程名,学分)
    其中课程编号是唯一的,课程编号就是一个主键
    成绩表(学号,课程号,成绩)
    成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键

    成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键

    同理 成绩表中的课程号是课程表的外键

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
    1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

    身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
    2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

    比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

    二、 主键、外键和索引的区别

    主键、外键和索引的区别?

    主键

    定义:

    唯一标识一条记录,不能有重复的,不允许为空
    在这里插入图片描述

    三、数据库中主键和外键的设计原则

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

    必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

    主键:

    关系数据库依赖于主键—它是数据库物理模式的基石。

    主键在物理层面上只有两个用途:

        1. 惟一地标识一行。
    
        2. 作为一个可以被外键有效引用的对象。
    

    基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:

        1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
    
        2. 主键应该是单列的,以便提高连接和筛选操作的效率
        
    
    
    
        注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
    
        3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
    
       注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
    
        4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
    
        5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中
    

    四、数据库主键选取策略

    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

    常见的数据库主键选取方式有:

    · 自动增长字段

    · 手动增长字段

    · UniqueIdentifier

    · “COMB(Combine)”类型

    1自动增长型字段

    很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主键键值。

    尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:

    Order(OrderID, OrderDate)
    OrderDetial(OrderID, LineNum, ProductID, Price)

    Order表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:

    首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。显然它们是相互矛盾的。

    除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

    ADO.NET允许我们在DataSet中将某一个字段设置为自动增长型字段,但千万记住,这个自动增长字段仅仅是个占位符而已,当数据库进行更新时,数据库生成的值会自动取代ADO.Net分配的值。所以为了防止用户产生误解,建议大家将ADO.NET中的自动增长初始值以及增量都设置成-1。此外,在ADO.NET中,我们可以为两张表建立DataRelation,这样存在级联关系的两张表更新时,一张表更新后另外一张表对应键的值也会自动发生变化,这会大大减少了我们对存在级联关系的两表间更新时自动增长型字段带来的麻烦。

    2手动增长型字段

    既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个KeyName,就可以知道目前的KeyValue是什么,然后手工实现键值数据递增。在SQL Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:

    CREATE PROCEDURE [GetKey]

    @KeyName char(10),
    @KeyValue int OUTPUT

    AS
    UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName
    Go

    这样,通过调用存储过程,我们可以获得最新键值,确保不会出现重复。若将OrderID字段设置为手动增长型字段,我们的程序可以由以下几步来实现:首先调用存储过程,获得一个OrderID,然后使用这个OrderID填充Order表与OrderDetail表,最后在事务保护下对两表进行更新。

    使用手动增长型字段作为主键在进行数据库间数据复制时,可以确保数据合并过程中不会出现键值冲突,只要我们为不同的数据库分配不同的主键取值段就行了。但是,使用手动增长型字段会增加网络的RoundTrip,我们必须通过增加一次数据库访问来获取当前主键键值,这会增加网络和数据库的负载,当处于一个低速或断开的网络环境中时,这种做法会有很大的弊端。同时,手工维护主键还要考虑并发冲突等种种因素,这更会增加系统的复杂程度。

    3使用UniqueIdentifier

    SQL Server为我们提供了UniqueIdentifier数据类型,并提供了一个生成函数NEWID( ),使用NEWID( )可以生成一个唯一的UniqueIdentifier。UniqueIdentifier在数据库中占用16个字节,出现重复的概率非常小,以至于可以认为是0。我们经常从注册表中看到类似

    {45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}

    的东西实际上就是一个UniqueIdentifier,Windows用它来做COM组件以及接口的标识,防止出现重复。在.NET里管UniqueIdentifier称之为GUID(Global Unique Identifier)。在C#中可以使用如下命令生成一个GUID:

    Guid u = System.Guid.NewGuid();

    对于上面提到的Order与OrderDetail的程序,如果选用UniqueIdentifier作为主键的话,我们完全可以避免上面提到的增加网络RoundTrip的问题。通过程序直接生成GUID填充主键,不用考虑是否会出现重复。

    UniqueIdentifier字段也存在严重的缺陷:首先,它的长度是16字节,是整数的4倍长,会占用大量存储空间。更为严重的是,UniqueIdentifier的生成毫无规律可言,要想在上面建立索引(绝大多数数据库在主键上都有索引)是一个非常耗时的操作。有人做过实验,插入同样的数据量,使用UniqueIdentifier型数据做主键要比使用Integer型数据慢,所以,出于效率考虑,尽可能避免使用UniqueIdentifier型数据库作为主键键值。

    4使用“COMB(Combine)”类型

    既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以解决呢?答案是肯定的。通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的),可以在三者之间找到一个很好的平衡点。

    COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:

    DECLARE @aGuid UNIQUEIDENTIFIER

    SET @aGuid = CAST(CAST(NEWID() AS BINARY(10))

    • CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)

    经过测试,使用COMB做主键比使用INT做主键,在检索、插入、更新、删除等操作上仍然显慢,但比Unidentifier类型要快上一些。关于测试数据可以参考我2004年7月21日的随笔。

    除了使用存储过程实现COMB数据外,我们也可以使用C#生成COMB数据,这样所有主键生成工作可以在客户端完成。

    展开全文
  • 外键约束

    2020-12-21 05:52:20
    [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (col_name, ...) REFERENCES tbl_name (col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] ... 确定外键约束名称 SHOW CREATE TABLE:

    [CONSTRAINT [symbol]] FOREIGN KEY

    [index_name] (col_name, ...)

    REFERENCES tbl_name (col_name,...)

    [ON DELETE reference_option]

    [ON UPDATE reference_option]

    reference_option:

    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

    [CONSTRAINT [symbol]] 外键约束命名 InnoDB表未定义时将自动生成约束名称。

    可以在create和alter语句中对列进行处理

    当UPDATE或DELETE操作影响子表中具有匹配父表中的行的键值时,结果取决于ON UPDATE、ON DELETE子句指定的引用动作。引用动作包括

    CASCADE:从父表中删除或更新该行,并自动删除或更新子表中的匹配行。支持ON DELETE CASCADE和ON UPDATE CASCADE。在两个表之间,不要定义ON UPDATE CASCADE作用于父表或子表中同一列上的多个子句。

    SET NULL:从父表中删除或更新该行,并将子表中的一个或多个外键列设置为NULL。支持ON DELETE SET NULL和ON UPDATE SET NULL。如果指定SET NULL操作,请确保未将子表中的列声明为NOT NULL。

    RESTRICT:拒绝父表的删除或更新操作。指定 RESTRIC(或NO ACTION)与省略ON DELETE or ON UPDATE子句相同。

    NO ACTION:标准SQL中的关键字。在MySQL中,等效于RESTRICT。如果引用表中有相关​​的外键值,则MySQL服务器会拒绝父表的删除或更新操作。一些数据库系统具有延迟检查,并且NO ACTION是延迟检查。在MySQL中,外键约束会立即检查,因此NO ACTION与RESTRICT相同。

    SET DEFAULT:这个动作由MySQL解析器认可,但是InnoDB和NDB都拒绝包含DELETE SET DEFAULT或UPDATE SET DEFAULT子句的表定义。

    对于支持外键的存储引擎,如果父表没有对应的值,创建子表的值时:MySQL将拒绝任何INSERT或UPDATE操作

    对于未指定的ON DELETE或ON UPDATE,默认操作始终为RESTRICT

    限制

    不能引用自身

    不支持前缀索引

    不支持分区的表的外键

    外键约束不能引用虚拟生成的列

    BLOB并且 TEXT列不能包含在外键中

    父表和子表必须使用相同的存储引擎,并且不能将它们定义为临时表

    具有外键关系的表不能更改为其他存储引擎。要更改存储引擎,必须首先删除任何外键约束

    外键和引用键中的对应列必须具有相似的数据类型。固定精度类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

    在外键和引用的键上的索引;在引用表中必须有一个索引,其中外键列按照相同的顺序作为第一列列出。如果索引不存在,则在引用表上自动创建索引。如果您创建了另一个可用于强制外键约束的索引,则此索引可能会在稍后以静默方式删除

    示例

    添加外键约束

    ALTER TABLE tbl_name

    ADD [CONSTRAINT [symbol]] FOREIGN KEY

    [index_name] (col_name, ...)

    REFERENCES tbl_name (col_name,...)

    [ON DELETE reference_option]

    [ON UPDATE reference_option]

    放弃外键约束

    ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

    确定外键约束名称

    SHOW CREATE TABLE:

    展开全文
  • Oracle 外键

    2021-05-07 07:14:47
    是能确定另一张表记录的字段,用于保持数据的一致性。 Oracle 外键创建 在Oracle数据库中,外键是强制实施参照完整性的一种方式,使用外键就意味着一个表中的值在另一个表中也必须出现。 被引用的表称为父表,而带有...

    Oracle 外键

    外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

    Oracle 外键创建

    在Oracle数据库中,外键是强制实施参照完整性的一种方式,使用外键就意味着一个表中的值在另一个表中也必须出现。
    被引用的表称为父表,而带有外键的表称为子表。子表中的外键通常会引用父表中的主键。

    1、使用CREATE TABLE语句创建

    使用CREATE TABLE语句创建外键的语法是:
    CREATE TABLE table_name
    (
      column1 datatype null/not null,
      column2 datatype null/not null,
      ...
      CONSTRAINT fk_column
        FOREIGN KEY (column1, column2, ... column_n)
        REFERENCES parent_table (column1, column2, ... column_n)
    );
    示例:
    CREATE TABLE supplier
    ( supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      contact_name varchar2(50),
      CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
    );
    CREATE TABLE products
    ( product_id numeric(10) not null,
      supplier_id numeric(10) not null,
      CONSTRAINT fk_supplier
        FOREIGN KEY (supplier_id)
        REFERENCES supplier(supplier_id)
    );
    在这个例子中,我们在supplier表上创建了一个名为supplier_pk的主键。 它只包含一个字段 - supplier_id字段。 然后,在products表上创建了一个名为fk_supplier的外键,该表根据supplier_id字段引用supplier表。
    也可以创建一个具有多个字段的外键,如下例所示:
    CREATE TABLE supplier
    ( supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      contact_name varchar2(50),
      CONSTRAINT supplier_pk PRIMARY KEY (supplier_id, supplier_name)
    );
    CREATE TABLE products
    ( product_id numeric(10) not null,
      supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      CONSTRAINT fk_supplier_comp
        FOREIGN KEY (supplier_id, supplier_name)
        REFERENCES supplier(supplier_id, supplier_name)
    );
    在这个例子中,外键称为fk_foreign_comp基于两个字段 - supplier_id和supplier_name字段引用供应商表。

    2、使用ALTER TABLE语句创建

    在ALTER TABLE语句中创建外键的语法是:
    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name
       FOREIGN KEY (column1, column2, ... column_n)
       REFERENCES parent_table (column1, column2, ... column_n);
    示例:
    ALTER TABLE products
    ADD CONSTRAINT fk_supplier
      FOREIGN KEY (supplier_id)
      REFERENCES supplier(supplier_id);
    在这个例子中,我们创建了一个名为fk_supplier的外键,它根据supplier_id字段引用supplier表的supplier_id字段。
    我们也可以创建一个具有多个字段的外键,如下例所示:
    ALTER TABLE products
    ADD CONSTRAINT fk_supplier
      FOREIGN KEY (supplier_id, supplier_name)
      REFERENCES supplier(supplier_id, supplier_name);

    Oracle 级联删除外键

    所谓的级联删除是指当主表中的一条记录被删除,那么子表中所关联的记录也相应的自动删除。本教程将教大家如何在Oracle中使用级联删除外键。

    使用CREATE TABLE语句定义级联删除

    以下是使用CREATE TABLE语句定义级联删除的语法:
    CREATE TABLE table_name
    (
      column1 datatype null/not null,
      column2 datatype null/not null,
      ...
      CONSTRAINT fk_column
         FOREIGN KEY (column1, column2, ... column_n)
         REFERENCES parent_table (column1, column2, ... column_n)
         ON DELETE CASCADE
    );
    示例:
    CREATE TABLE supplier
    ( supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      contact_name varchar2(50),
      CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
    );
    CREATE TABLE products
    ( product_id numeric(10) not null,
      supplier_id numeric(10) not null,
      CONSTRAINT fk_supplier
        FOREIGN KEY (supplier_id)
        REFERENCES supplier(supplier_id)
        ON DELETE CASCADE
    );
    以上示例中,我们在supplier表创建了一个名为supplier_pk的主键,这个主键只包含supplier_id字段。
    然后在products表上创建了一个名为fk_supplier的外键,该表根据supplier_id字段引用supplier表的supplier_pk字段。
    由于级联删除,当supplier表中的记录被删除时,products表中相应的所有记录也将被删除,因为这些记录具有相同的supplier_id值。
    此外,我们也可以创建一个具有多个字段的外键(带级联删除),如下例所示:
    CREATE TABLE supplier
    ( supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      contact_name varchar2(50),
      CONSTRAINT supplier_pk PRIMARY KEY (supplier_id, supplier_name)
    );
    CREATE TABLE products
    ( product_id numeric(10) not null,
      supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      CONSTRAINT fk_supplier_comp
        FOREIGN KEY (supplier_id, supplier_name)
        REFERENCES supplier(supplier_id, supplier_name)
        ON DELETE CASCADE
    );
    在这个例子中,fk_foreign_comp外键基于两个字段:supplier_id和supplier_name字段引用supplier表。
    根据supplier_id和supplier_name删除supplier表中的记录时,外键fk_foreign_comp上的级联删除会导致products表中的所有对应记录也会被级联删除。

    使用ALTER TABLE语句定义级联删除

    除了CREATE TABLE语句外,我们还可以用ALTER TABLE语句定义级联删除,具体语法如下:
    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name
       FOREIGN KEY (column1, column2, ... column_n)
       REFERENCES parent_table (column1, column2, ... column_n)
       ON DELETE CASCADE;
    示例:
    ALTER TABLE products
    ADD CONSTRAINT fk_supplier
      FOREIGN KEY (supplier_id)
      REFERENCES supplier(supplier_id)
      ON DELETE CASCADE;
    在本例中,我们创建了一个名为fk_supplier的外键(带级联删除),该外键基于supplier_id字段引用supplier表。
    此外,我们也可以创建一个具有多个字段的外键(带级联删除),如下例所示:
    ALTER TABLE products
    ADD CONSTRAINT fk_supplier
      FOREIGN KEY (supplier_id, supplier_name)
      REFERENCES supplier(supplier_id, supplier_name)
      ON DELETE CASCADE;

    Oracle 怎么删除外键

    在Oracle中,如何去删除自己创建的外键呢?本教程就为大家介绍Oracle中删除外键的方法。
    在Oracle中,我们可以使用ALTER TABLE语句来对外键进行删除。
    语法
    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name;
    示例
    我们先使用下方的代码创建一个外键:
    CREATE TABLE supplier
    ( supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      contact_name varchar2(50),
      CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
    );
    CREATE TABLE products
    ( product_id numeric(10) not null,
      supplier_id numeric(10) not null,
      CONSTRAINT fk_supplier
        FOREIGN KEY (supplier_id)
        REFERENCES supplier(supplier_id)
    );
    通过以上代码,我们在supplier表上创建了一个名为supplier_pk的主键。然后再在products表上创建了一个名为fk_supplier的外键。
    如果我们想要删除这个新创建的外键,我们可以执行以下的代码:
    ALTER TABLE products
    DROP CONSTRAINT fk_supplier;
    这样,我们就成功的删除了这个新建的fk_supplier外键。

    Oracle 怎么禁用外键

    我们创建外键后,可能有时会遇到要禁用外键的情况,那么在Oracle中,我们如何对外键进行禁用呢?
    语法
    在Oracle中,我们要禁用外键可以使用以下语法:
    ALTER TABLE table_name
    DISABLE CONSTRAINT constraint_name;
    示例:
    我们先通过以下代码创建一个名为fk_supplier的外键:
    CREATE TABLE supplier
    ( supplier_id numeric(10) not null,
      supplier_name varchar2(50) not null,
      contact_name varchar2(50),
      CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
    );
    CREATE TABLE products
    ( product_id numeric(10) not null,
      supplier_id numeric(10) not null,
      CONSTRAINT fk_supplier
        FOREIGN KEY (supplier_id)
        REFERENCES supplier(supplier_id)
    在这个例子中,在supplier表上创建了一个名为supplier_pk的主键。 它只包含一个字段 - supplier_id字段。 然后,我们在products表上创建了一个名为fk_supplier的外键,products表的supplier_id字段引用supplier表的supplier_id字段。
    如果想禁用这个外键,可以执行以下命令:
    ALTER TABLE products
    DISABLE CONSTRAINT fk_supplier;

    Oracle 启用外键

    在Oracle中,面对已经被禁用的外键,我们该如何将它重新启用呢?本教程就为大家带来Oracle外键启用方法。
    外键启用语法
    ALTER TABLE table_name
    ENABLE CONSTRAINT constraint_name;
    示例:
    我们可以先创建一个名为fk_supplier的外键,
    然后对这个外键进行禁用,
    现在,我们将重新启用这个被禁用的fk_supplier外键,可以执行以下命令:
    ALTER TABLE products
    ENABLE CONSTRAINT fk_supplier;
    这样,原先被禁用的外链就被重新启用了,非常简单。
    展开全文
  • ;首先定义主表的主键 选择SQL Server Management Studio目录树中数据库目录下的数据库...表和列界面在此界面中选择主表中的主键及从表中的外键然后单击确定按钮进入 外键关系界面 退出界面并根据提示将关系图的有关信
  • 外键的使用

    2021-02-23 11:21:55
    【前言】最近做项目的时候,一直有一个疑惑为什么现在做项目建表的时候,大家都不使用外键,而是在应用使用代码逻辑解决多表之间的关联关系。 【复习】主键、外键 定义主键和外键主要是为了维护关系数据库的完整...
  • SQL Server 2012 外键约束(定义外键、删除外键

    万次阅读 多人点赞 2019-04-21 20:00:26
    文章目录准备知识定义外键使用SSMS工具定义外键使用SQL方式定义外键删除外键使用SSMS工具删除外键方式一:在对象资源管理器中删除主键方式二:在表设计器中删除主键使用SQL方式删除外键 准备知识     外键...
  • MySQL 外键使用

    2021-02-08 13:22:41
    MySQL 外键使用外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但...
  • Oracle外键约束

    2021-04-30 07:53:30
    一、创建外键约束两种方法1.创建表时create table 子表(id number,name varchar2(5),foreign key(id) references 父表(列名));2.随时更改alter table 子表 drop constraint 约束名;alter table 子表 add constraint ...
  • Mysql添加外键

    2021-08-09 22:27:49
    当时我的思考过程 构造表格的语句肯定是不会出错(因为构造语句是show create table student得出的) 当时我就认为问题肯定是出现在添加外键的语句 那么分析添加外键的语句的问题 声明键的语句 KEY FK_name(name) ...
  • 假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%” 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持....
  • 外键外键约束

    2020-12-21 05:52:32
    外键外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系什么是外键约束右边的DepartmentID是外键外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。On ...
  • 主键、外键

    2021-08-28 19:54:50
    外键(FOREIGN KEY) 主键(PRIMARY KEY) 主键(PRIMARY KEY)的完整称呼是“主键约束”。 MySQL主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。 这样的一列或多列称为表的主键,通过它可以强制...
  • MySQL主键跟外键

    千次阅读 2021-01-19 05:46:35
    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是...
  • Oracle外键

    千次阅读 2019-04-10 20:54:50
    在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个。打个比喻。外键是指定义外键的表的列的值必须在还有一个表中出现。 被參照的表称之为父表(parent table),创建外键的表称之为子表(child table)。...
  • MySQL表创建及外键

    2021-01-18 19:18:06
    从表中随机取出一条数据,结果无确定性。 只有通过order by 排序之后取出的数据才是确定的。 (3)创建表 官方文档表创建的语法 (1)临时表创建 create database temp; use temp; create temporary table temp_a(a int)...
  • mysql主键 外键

    2021-01-27 15:08:51
    1.主键的作用主键是能确定一条记录的唯一标识,主键字段必须唯一,必须非空,一个表中只能有一个主键,主键可以包含一个或多个字段。打个比方,一条记录包括身份正号,姓名,年龄,学校,国籍,性别等。身份证号是...
  • 外键

    2019-04-30 13:01:51
    外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性。 比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。 表的外键大多是另一表的主键,外键可以有重复的,可以是空值 用来和...
  • 实体框架外键映射

    2021-03-01 06:13:15
    我正在试图确定EF6告诉我什么,这对我来说没有多大意义,所以我希望有人在这里澄清一下 .我正在设置我的FluentApi(在DB中使用的复合键,这是来自数据库的Code First):modelBuilder.Entity().HasKey(e => new { e...
  • 到底谁是外键

    2021-11-01 16:19:35
    以主表的主键值作为外键,可以通过外键与主表进行关联查询。 外键位于从表之上,制约主表。 始终要清楚的是,无论是外键还是主键,指的都是某个表的一个(当然主键可以是多个)字段(或者叫列)。 详细描述 如图有...
  • MySQL3_外键及查询

    2022-05-19 09:08:12
    文章目录MySQL_外键及查询1.数据的完整性(1).保证实体的完整(2).保证域的完整性(3).引用的完整性(4).自定义完整性2.外键3.实体之间的关系(1).一对一:主键关系(2)一对多|多对一(3)多对多4.数据库的设计5.数据的规范(1...
  • 外键 主键 概念

    千次阅读 2020-11-04 09:09:17
    关于数据库主键和外键(终于弄懂啦) 关系型数据库中的一条记录中有若干个属性, 若其中某一个属性组(注意是组)能唯一标识一条记录, 该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生...
  • 主键与外键

    2021-05-20 11:53:07
    主键与外键: 什么是主键: 主键是能确定一条记录的唯一标识。 举个栗子: 比如身份证上面的信息,它包括姓名、性别、出生日期、身份证号等信息; 在这些信息中,姓名、性别、出生日期等都有可能重复;只有身份证号...
  • PowerDesigner设置外键外键名称

    千次阅读 2019-09-17 11:29:13
    在物理模型图上创建, 点击palette中的Reference,选择子表拉到父表,这样就出了一条关系线 双击关系线,或右键点击属性... 输入Name ...输入Integrity,这要不输入的话,Preview里的sql中用的不是上面输入的Name ......
  • MySQL-外键对应关系

    2021-01-19 05:38:01
    表的扩展性极差(无法忽略的缺点)所以出现表的拆分,这样就涉及到表与表之间的关联性一、表与表之间建关系如何让两种表有代码层面上真正的关联,就必须使用外键外键就是让表与表有硬性层面上的关系。对应方式:一对...
  • 如何设置数据库中的外键

    万次阅读 2021-01-30 08:19:41
    展开全部创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只e69da5e887aa62616964757a686964616f31333365653739有主键没有外键时不行的。建外键的前提是此外键必须是另外一个表的...
  • MySQL主外键设置

    2021-12-02 17:27:30
    Q:主外键的关系 pr:ALTER TABLE tb_UserAndRole ADD CONSTRAINT FK__tb_UandR_Role FOREIGN KEY (RoleID) references tb_Role(ID); pr:alert外键名,foreign key(外键字段)reference主表(主键名) pr:本表...
  • QL的主键和外键的作用:外键取值规则:空值或参照的主键值。(1)插入非空值时,如果主键表中没有这个值,则不能插入。(2)更新时,不能改为主键表中没有的值。(3)删除主键表记录时,你可以在建外键时选定外键记录一起...
  • mysql数据库外键、主键详解

    千次阅读 2021-01-18 18:41:25
    一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,350
精华内容 28,940
关键字:

外键怎么确定