精华内容
下载资源
问答
  • sql设置外键(设置外键的sql语句)2020-07-24 11:44:03共8个回答sql怎么设置外键创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只有主键没有外键时不行的。建外键的前提是此外键...

    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(外键名) foreign key(studentNo) references T_Student(studentNo)”。

    41cf53a17148c23ed0678ef4ece3cd4e.png

    怎么在SQL中设置外键

    sql ce表中建立外键约束的语法:CREATE TABLE DetectTable(UserID integer,StartTime datetime not null,EndTime datetime not null,MassName nvarchar(10), foreign key (UserID) references UserTable(UserID)),其中,UserID为UserTable表中的主键。

    也可以在创建数据库关系图直接拖

    在数据库关系图上右键-->新建关系图-->添加表

    然后直接用鼠标拖字段连接就可以建立外键约束了

    SQL数据库设计规范及如何设置外键

    20个数据库设计最佳实践: 使用明确、统一的标明和列名,例如 School, SchoolCourse, CourceID。 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses。 数据表名不要使用空格。 数据表名不要使用不必要的前缀或者后缀,例如使用School,而不是TblSchool,或者SchoolTable等等。 数据库中的密码要加密,到应用中再解密。 使用整数作为ID字段,也许现在没有这个必要,但是将来需要,例如关联表,索引等等。 使用整数字段做索引,否则会带来很大的性能问题 。 使用bit 作为布尔字段,使用整数或者varcha是浪费。同时,这类字段应该以“Is”开头。 要经过认证才能访问数据库,不要给每一个用户管理员权限。 尽量避免使用“select *”,而使用“select [required_column_list]”以获得更好的性能。 假如程序代码比较复杂,使用ORM框架,例如hibernate,iBatis。ORM框架的性能问题可以通过详细的配置去解决。 分割不常使用的数据表到不同的物理存储以获得更好的性能。 对于关键数据库,使用安全备份系统,例如集群,同步等等。 使用外键,非空等限制来保证数据的完整性,不要把所有的东西都扔给程序。 缺乏数据库文档是致命的。你应该为你的数据库设计写文档,包括触发器、存储过程和其他脚本。 对于经常使用的查询和大型数据表,要使用索引。数据分析工具可以帮助你决定如何建立索引。 数据库服务器和网页服务器应该放在不同的机器上。这回提高安全性,并减轻CPU压力。 Image和blob字段不应该定义在常用的数据表中,否则会影响性能。 范式(Normalization)要按照要求使用以提高性能。Normalization做的不够会导致数据冗余,而过度Normalization 会导致太多的join和数据表,这两种情况都会影响性能。 多花点时间在数据库设计上,否则你将来会付出加倍的时间来偿还。设置外键:方法一:SQL语句alter table 表名 add constraint 外键名 foreign key(字段名) references 主表名(字段名) on delete cascade方法二:不想写sql 语句也可以直接用图形化操作 选择你要创建外键的表,反键选择修改表,点击

    sql如何在创建表时设置外键

    create table 表名(

    列名1 参数,

    列名2 参数,

    foreign key(列名) references 目标表名(目标列名)

    );

    sql如何创建事务或设置外键

    可以用一个触发器:

    create trigger tri_stu

    on 地址表

    for update

    as

    declare @id int

    declare @address varchar(20)

    select @id=id,@address=address from inserted

    update 学生表 set address=@address where id=@id..id是2个表相关联的列

    建外键:

    alter table 外键表

    add constraint fk_stu

    foreign key(外键列) references 主键表(主键列)

    SQL主外键设置

    你可以在[dbo].[tb_Article]这个表中的[CategoryID] [int] NOT NULL 后面增加外键关系 primarykey references [dbo].[tb_Category]([categoryid]);

    主外键主要是为了控制你在表[dbo].[tb_Article]中插入数据的时候必须是 该条数据的[CategoryID] 必须是已经在 [dbo].[tb_Category]中出现的,而且他们的数据类型以及长度都必须相同,完全一致。

    sql 设置主外键关系语句

    --表tb_user

    create table tb_user (

    id int not null,

    username varchar(32) not null

    );

    --给tb_user添加主键

    alter table tb_user add constraint pk_users primary key (id);

    --表tb_course

    create table tb_course (

    id int not null primary key,

    name varchar(20) not null

    );

    --表tb_mark

    create table tb_mark (

    uid int not null,

    cid int not null,

    mark int not null,

    primary key (uid, cid)

    );

    --给tb_mark添加外键

    alter table tb_mark add constraint fk_uid foreign key(uid) references tb_user(id);

    alter table tb_mark add constraint fk_cid foreign key(cid) references tb_course(id);

    sql 如何设置外键??

    foreign key references tb2(id)

    主键和主键约束 一个意思

    展开全文
  • 根据情况需要将创建外键的sql语句生成在创建表的sql语句中,如下设置: 转载于:https://www.cnblogs.com/abel-he/p/8301548.html

    根据情况需要将创建外键表的sql语句生成在创建表的sql语句中,如下设置:

    转载于:https://www.cnblogs.com/abel-he/p/8301548.html

    展开全文
  • 首先,目前在产品环境可用MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允许使用外键,所以,我们数据表必须使用InnoDB引擎。下面,我们先创建以下测试用数据库表:CODE:[Copy to clipboard]CREATE TABLE `...

    首先,目前在产品环境可用的MySQL

    版本(指4.0.x

    和4.1.x

    )中,只有InnoDB

    引擎才允许使用外键,所以,我们的数据表必须使用InnoDB

    引擎。

    下面,我们先创建以下测试用数据库表:CODE:[Copy to clipboard]CREATE TABLE `roottb` (

    `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,

    `data` VARCHAR(100) NOT NULL DEFAULT '',

    PRIMARY KEY (`id`)

    ) TYPE=InnoDB;

    CREATE TABLE `subtb` (

    `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,

    `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',

    `data` VARCHAR(100) NOT NULL DEFAULT '',

    PRIMARY KEY (`id`),

    INDEX (`rootid`),

    FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE

    ) TYPE=InnoDB;

    注意:1

    、必须使用InnoDB

    引擎;2

    、外键必须建立索引(INDEX

    );3

    、外键绑定关系这里使用了“ ON DELETE CASCADE”

    ,意思是如果外键对应数据被删除,将关联数据完全删除,更多信息请参考MySQL

    手册中关于InnoDB

    的文档;

    好,接着我们再来插入测试数据:CODE:[Copy to clipboard]INSERT INTO `roottb` (`id`,`data`)

    VALUES ('1', 'test root line 1'),

    ('2', 'test root line 2'),

    ('3', 'test root line 3');

    INSERT INTO `subtb` (`id`,`rootid`,`data`)

    VALUES ('1', '1', 'test sub line 1 for root 1'),

    ('2', '1', 'test sub line 2 for root 1'),

    ('3', '1', 'test sub line 3 for root 1'),

    ('4', '2', 'test sub line 1 for root 2'),

    ('5', '2', 'test sub line 2 for root 2'),

    ('6', '2', 'test sub line 3 for root 2'),

    ('7', '3', 'test sub line 1 for root 3'),

    ('8', '3', 'test sub line 2 for root 3'),

    ('9', '3', 'test sub line 3 for root 3');

    我们先看一下当前数据表的状态:CODE:[Copy to clipboard]mysql>; show tables;

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

    | Tables_in_test |

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

    | roottb |

    | subtb |

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

    2 rows in set (0.00 sec)

    mysql>; select * from `roottb`;

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

    | id | data |

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

    | 1 | test root line 1 |

    | 2 | test root line 2 |

    | 3 | test root line 3 |

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

    3 rows in set (0.05 sec)

    mysql>; select * from `subtb`;

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

    | id | rootid | data |

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

    | 1 | 1 | test sub line 1 for root 1 |

    | 2 | 1 | test sub line 2 for root 1 |

    | 3 | 1 | test sub line 3 for root 1 |

    | 4 | 2 | test sub line 1 for root 2 |

    | 5 | 2 | test sub line 2 for root 2 |

    | 6 | 2 | test sub line 3 for root 2 |

    | 7 | 3 | test sub line 1 for root 3 |

    | 8 | 3 | test sub line 2 for root 3 |

    | 9 | 3 | test sub line 3 for root 3 |

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

    9 rows in set (0.01 sec)

    嗯,一切都正常,好,下面我们要试验我们的级联删除功能了。

    我们将只删除roottb

    表中id

    为2

    的数据记录,看看subtb

    表中rootid

    为2

    的相关子纪录是否会自动删除:CODE:[Copy to clipboard]mysql>; delete from `roottb` where `id`='2';

    Query OK, 1 row affected (0.03 sec)

    mysql>; select * from `roottb`;

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

    | id | data |

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

    | 1 | test root line 1 |

    | 3 | test root line 3 |

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

    2 rows in set (0.00 sec)

    mysql>; select * from `subtb`;

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

    | id | rootid | data |

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

    | 1 | 1 | test sub line 1 for root 1 |

    | 2 | 1 | test sub line 2 for root 1 |

    | 3 | 1 | test sub line 3 for root 1 |

    | 7 | 3 | test sub line 1 for root 3 |

    | 8 | 3 | test sub line 2 for root 3 |

    | 9 | 3 | test sub line 3 for root 3 |

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

    6 rows in set (0.01 sec)

    嗯,看subtb

    表中对应数据确实自动删除了,测试成功。

    结论:在MySQL

    中利用外键实现级联删除成功!

    展开全文
  • 定义数据表假如某个电脑生产商,它数据库中保存着整机和配件产品信息。用来保存整机产品信息表叫做 pc;用来保存配件供货信息表叫做 parts。在 pc 表中有一个字段,用来描述这款电脑所使用CPU型号;在 ...

    定义数据表假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做 pc;用来保存配件供货信息的表叫做 parts。

    在 pc 表中有一个字段,用来描述这款电脑所使用的CPU型号;

    在 parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。

    很显然,这个厂家生产的电脑,其使用的 cpu 一定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)—— pc 表中的 cpu 型号受到 parts 表中型号的约束。

    首先我们来创建 parts 表:

    CREATE TABLE parts (

    ... 字段定义 ...,

    model VARCHAR(20) NOT NULL,

    ... 字段定义 ...

    );

    接下来是 pc 表:

    CREATE TABLE pc (

    ... 字段定义 ...,

    cpumodel VARCHAR(20) NOT NULL,

    ... 字段定义 ...

    };

    设置索引

    若要设置外键,在参照表 (referencing table,即pc表) 和被参照表 (referenced table,即parts表) 中,相对应的两个字段必须都设置索引 (index)。

    对parts表:

    ALTER TABLE parts ADD INDEX idx_model (model);

    这句话的意思是,为 parts 表增加一个索引,索引建立在 model 字段上,给这个索引起个名字叫idx_model。

    对pc表也类似:

    ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

    事实上这两个索引可以在创建表的时候就设置。这里只是为了突出其必要性。

    定义外键

    下面为两张表之间建立前面所述的那种“约束”。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其他表。

    ALTER TABLE pc ADD CONSTRAINT fk_cpu_model

    FOREIGN KEY (cpumodel)

    REFERENCES parts(model);

    第一行是说要为pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。

    这样,我们的外键就搞好了!如果我们试着CREATE一台pc,它所使用的 cpu 的型号是 parts 表中不存在的,那么 MySQL 会禁止这台 PC 被 CREATE 出来。

    级联操作

    一切看起来都挺好的,不是吗?

    考虑以下这种情况:

    技术人员发现,一个月之前输入到 parts 表中的某个系列的 cpu (可能有很多款)的型号全都输错了一个字母,现在需要改正。我们希望的是,当 parts 表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。

    可以在定义外键的时候,在最后加入这样的关键字:

    ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。:)

    如果把这语句完整的写出来,就是:

    ALTER TABLE pc ADD CONSTRAINT fk_cpu_model

    FOREIGN KEY (cpumodel)

    REFERENCES parts(model)

    ON UPDATE CASCADE;

    除了 CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作。

    InnoDB拒绝任何试着在子表创建一个外键值而不匹配在父表中的候选键值的INSERT或UPDATE操作。一个父表有一些匹配的行的子表,InnoDB对任何试图更新或删除该父表中候选键值的UPDATE或DELETE操作有所动作,这个动作取决于用FOREIGN KEY子句的ON UPDATE和ON DETETE子句指定的referential action。当用户试图从一个父表删除或更新一行之时,且在子表中有一个或多个匹配的行,InnoDB根据要采取的动作有五个选择:

    · CASCADE: 从父表删除或更新且自动删除或更新子表中匹配的行。ON DELETE CASCADE和ON UPDATE CASCADE都可用。在两个表之间,你不应定义若干在父表或子表中的同一列采取动作的ON UPDATE CASCADE子句。

    · SET NULL: 从父表删除或更新行,并设置子表中的外键列为NULL。如果外键列没有指定NOT NULL限定词,这就是唯一合法的。ON DELETE SET NULL和ON UPDATE SET NULL子句被支持。

    · NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新操作。

    · RESTRICT: 拒绝对父表的删除或更新操作。NO ACTION和RESTRICT都一样,删除ON DELETE或ON UPDATE子句。(一些数据库系统有延期检查,并且NO ACTION是一个延期检查。在MySQL中,外键约束是被立即检查的,所以NO ACTION和RESTRICT是同样的)。

    · SET DEFAULT: 这个动作被解析程序识别,但InnoDB拒绝包含ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT子句的表定义。

    展开全文
  • 能够写出删除外键约束的SQL语句 1. 外键约束作用 外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性 2. 对于已经存在的字段添加外键...
  • 定义数据表假如某个电脑生产商,它数据库中保存着整机和配件产品信息。用来保存整机产品信息表叫做 pc;用来保存配件供货信息表叫做 parts。在 pc 表中有一个字段,用来描述这款电脑所使用CPU型号;在 ...
  • 仅需简单的理清思路便可从USER_CONSTRAINTS和USER_CONS_COLUMNS视图中获得创建外键的必要信息,进而可以按需生成自己需要微调的外键创建脚本。例如想批量生成带有“on delete cascad...
  • 创建外键的sql语句

    千次阅读 2012-09-12 10:48:43
    create table tablename ( id int(11) not null, name varchar(256) not null, school_id int(11) not null, primary key(id), foreign key(school_id) references school(id) ...其中school为表名
  • 外键SQL语句的编写

    2021-03-26 13:12:21
    外键约束:对外键字段值进行更新和插入时会和引用表中字段数据进行验证,数据如果不合法则更新和插入会失败,保证数据有效性。 2. 对于已经存在字段添加外键约束 -- 为cls_id字段添加外键约束 alter ...
  • 数据库中外键SQL语句的编写 1. 外键约束作用 外键约束:对外键字段值进行更新和插入时会和引用表中字段数据进行验证,数据如果不合法则更新和插入会失败,保证数据有效性 2. 对于已经存在字段添加外键约束...
  • REFERENCE_CLIENT foreign key (ClientId) references dbo.Client (ClientId) on delete cascade 这样在进行删除数据的时候就不用两张表中的数据依次进行删除了而直接删除主表中的记录就可以了,含有外键的记录自动...
  • sql server中解除与启用外键约束的语句 创建外键: ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main; 暂时 停用 外键约束 ALTER TABLE test_sub NOCHECK CONSTRAINT ...
  • 表teacher: create table teacher ( ...在teacher_course表中创建外键tno和cno,运行时报错“消息 156,级别 15,状态 1,第 14 行 关键字 'foreign' 附近有语法错误。” 是为什么 谢谢各位~
  • --sql语句创建同时添加外键约束CREATE TABLE tb_UserAndRole --用户角色表(ID INT PRIMARY KEY IDENTITY(1,1),UserID INT NOT NULL,--用户IDRoleID INT NOT NULL,--角色IDforeign key(UserID) references tb_...
  • sql创建外键

    千次阅读 2015-09-15 08:39:59
    创建外键约束有两种情形,一是在建立表时候就创建,另一种是在表建立以后再修改添加外键约束。 第一种:建立表时候就创建 通过SQL语句创建主外键表 create table UserInfo( UserID int identity(1,1) ...
  • 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张表的编码charset和collate不一致,2张表都执行执行SQL语句:alter table 表名 ...
  • 外键的作用是建立子表与父表的关联关系,是约束父表和子表, 1.父表和子表存储引擎一样且只能为InnoDB,禁止使用临时表, 2.外键列和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同,而字符...
  • sql语句创建同时添加外键约束

    千次阅读 2020-11-22 21:13:00
    sql语句创建同时添加外键约束 建立一个商店数据库store,记录顾客及其购物情况,由下面三个表组成: 商品(商品号,商品名,单价,商品类别,供应商); 顾客(顾客号,姓名,住址); 订单(顾客号,商品...
  • REFERENCE_CLIENT foreign key (ClientId) references dbo.Client (ClientId) on delete cascade 这样在进行删除数据的时候就不用两张表中的数据依次进行删除了而直接删除主表中的记录就可以了,含有外键的记录自动...
  • 本文示例使用Birt自带Sample数据源,用到数据基于图1所示实体...其中customers表customernumber字段作为外键出现在orders表中,而orders表ordernumber字段做为外键出现在orderdetails表中。 create TABLE...
  • 展开全部1、创建主键表,test_class,并建立class_id字段为主键;create table test_class(class_id number, class_name varchar2(20));-- Create/Recreate indexesalter table TEST_CLASSadd constraint P_CLASS_ID...
  • 首先,目前在产品环境可用MySQL 版本(指4.0.x 和4.1.x )中,只有InnoDB 引擎才允许使用外键,所以,我们数据表必须使用InnoDB 引擎。 下面,我们先创建以下测试用数据库表:CODE:[Copy to clipboard]CREATE ...
  • SQL的主键和外键的作用 SQL的主键和外键约束   SQL的主键和外键的作用:  外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中...
  • 1、删除外键约束,建立外键约束 先建立3个表: /* drop table tb drop table tb_b drop table tb_c */ --建立3个关联表 create table tb(id int primary key ,vv varchar(10)) create table tb_b( idd int ...
  • Activiti 工作流引擎自带建库脚本,同时生成了索引、外键...一、查找创建外键的 sql 语句在 Activiti 中databaseSchemaUpdate属性设置建表策略,值为 true 是,如果没有表,自动创建表,否则不自动创建表。在 IntelliJ
  • 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张表的编码charset和collate不一致,2张表都执行执行SQL语句: alter table 表名 ...
  • 建立外键约束可以对sql语句的增删改有约束作用。外键取值规则:空值或参照主键值。(1)插入非空值时,如果主键表中没有这个值,则不能插入。(2)更新时,不能改为主键表中没有值。(3)删除主键表记录时,你可以在建...
  • 为mysql数据表建立主外键需要注意以下几点:需要建立主外键关系两个表存储引擎必须是InnoDB。外键列和参照列必须...一、SQL语句创建数据表并设置主外键关系create table demo.ChineseCharInfo(ID int not nul...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 828
精华内容 331
关键字:

创建外键的sql语句