SQL数据库创建外键

合集下载

MySQL中外键的定义和使用方法详解

MySQL中外键的定义和使用方法详解

MySQL中外键的定义和使用方法详解引言:MySQL是一种流行的关系型数据库管理系统,被广泛应用于各种业务场景中。

在数据库设计中,关系型数据库的一项重要特性就是外键约束。

下面本文将详细介绍MySQL中外键的定义和使用方法。

一、什么是外键?外键是关系型数据库中用于建立不同表之间关联关系的一种约束。

通过外键约束,可以维护不同表之间的一致性和完整性。

它建立在表的列上,用于指定该列的值必须来自于另一张表的主键或唯一键。

二、如何定义外键?要定义外键,需要满足以下条件:1. 外键列和参考表的主键或唯一键列的数据类型和长度必须一致;2. 外键列与参考表的主键或唯一键列之间必须建立正确的关系;3. 外键列必须定义为NOT NULL约束。

为了演示外键的定义和使用,我们创建两张表:学生表(students)和课程表(courses)。

CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,age INT NOT NULL);CREATE TABLE courses (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,student_id INT,FOREIGN KEY (student_id) REFERENCES students(id));在上述示例中,students表的id列是主键。

courses表的student_id列是外键,它参考了students表的id列作为关联。

三、外键的使用方法:1. Insert操作:当我们向courses表中插入数据时,可以利用外键约束来保证数据的完整性。

例如:INSERT INTO courses (name, student_id) VALUES ('Math', 1);在上述示例中,由于student_id是外键,它的值必须来自于students表的id列。

sql中如何创建和删除外键

sql中如何创建和删除外键

SQL Server 2005中如何创建和删除外键最近了解到数据库中创建外键的方法,便记录下来,以防忘记。

在SQL Server 2005中,为了保证数据库的完整性,创建外键是我们经常用到的。

创建外键有两种直接的方法。

一种是通过写代码创建外键,一种是通过新建数据库关系图(不用写代码)创建外键。

在建表前考虑清楚了并在建表的时候就创建外键当然很好,然而,手动建表且没有创建外键,但在后面需要创建外键时怎么办呢?在创建外键之前需建立表,例如:学生——选课表//学生表Create Table Student(Sno CHAR(10) primary key,Sname CHAR(10)not null,Ssex CHAR(2),Sage INT,Sdept Varchar(10))//课程表Create Table Course(Cno CHAR(4)primary key,CName CHAR(20)not null,Cpno CHAR(4),Ccredit INT)//选课表Create TABLE SC(Sno CHAR(10)not null,Cno CHAR(4)not null,Grade INT,Primary key(Sno,Cno),Foreign key (Sno) references Student(Sno),Foreign key (Cno) references Course(Cno))注:当然也可以手动的创建表。

以上代码中已经在定义表是创建外键。

如果创建表时没有创建外键,则:、(1)运用编写代码增加外键alter table SCadd constraint SMPKey(外键名) foreign key(Sno)references student(Sno), add constraint CMPKey(外键名) foreign key(Cno)references Course(Cno) (2)新建数据库关系图增加外键展开所建数据库,找到数据库关系图,右键——>新建数据库关系图,在弹出的对话框(如图1.1)中添加与要增加外键的表以及包含外键的表(如图1.2),单击“添加”,然后关闭该对话框。

sql操作数据库(3)--外键约束、数据库表之间的关系、三大范式、多表查询、事务

sql操作数据库(3)--外键约束、数据库表之间的关系、三大范式、多表查询、事务

sql操作数据库(3)--外键约束、数据库表之间的关系、三⼤范式、多表查询、事务外键约束在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)删除外键语法: alter table 从表表名 drop foreign key 外键名称;级联操作:注意:在从表中,修改关联主表中不存在的数据,是不合法的在主表中,删除从表中已经存在的主表信息,是不合法的。

直接删除主表(从表中有记录数据关联) 会包删除失败。

概念:在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作。

语法:更新级联 on update cascade 级联更新只能是创建表的时候创建级联关系。

当更新主表中的主键,从表中的外键字段会同步更新。

删除级联 on delete cascade 级联删除当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。

操作:-- 给从表student添加级联操作create table student(s_id int PRIMARY key ,s_name VARCHAR(10) not null,s_c_id int,-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束ON UPDATE CASCADE ON DELETE CASCADE)insert into student VALUE(1,'⼩孙',1),(2,'⼩王',2),(3,'⼩刘',4);insert into student VALUE(4,'⼩司马',1),(5,'⼩赵',1),(6,'⼩钱',1);-- 查询学⽣表中的记录select * from student;-- 级联操作。

mysqlsqlserveroracle三种数据库维护索引外键字段语法总结

mysqlsqlserveroracle三种数据库维护索引外键字段语法总结

mysqlsqlserveroracle三种数据库维护索引外键字段语法总结下面是MySQL、SQL Server和Oracle三种数据库在维护索引、外键和字段方面的语法总结:1.MySQL:-创建索引:-在已有表的列上创建索引:```ALTER TABLE table_name ADD INDEX index_name (column_name);```-在已有表的多个列上创建联合索引:```ALTER TABLE table_name ADD INDEX index_name (column1, column2);```-创建外键:-在已有表的列上创建外键:```ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES referenced_table_name (referenced_column_name);```-修改字段:-修改字段的数据类型和长度:```ALTER TABLE table_name MODIFY column_namenew_data_type(length);```2. SQL Server:-创建索引:-在已有表的列上创建索引:```CREATE INDEX index_name ON table_name (column_name);```-在已有表的多个列上创建联合索引:```CREATE INDEX index_name ON table_name (column1, column2);```-创建外键:-在已有表的列上创建外键:```ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES referenced_table_name (referenced_column_name);```-修改字段:-修改字段的数据类型和长度:```ALTER TABLE table_name ALTER COLUMN column_namenew_data_type(length);```3. Oracle:-创建索引:-在已有表的列上创建索引:```CREATE INDEX index_name ON table_name (column_name);```-创建外键:-在已有表的列上创建外键:```ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES referenced_table_name (referenced_column_name);```-修改字段:-修改字段的数据类型和长度:```ALTER TABLE table_name MODIFY column_namenew_data_type(length);```需要注意的是述语法只是简要总结了MySQL、SQL Server和Oracle 在维护索引、外键和字段方面的常见语法。

SQL外键——精选推荐

SQL外键——精选推荐

SQL外键外键:外键是⽤来再两个表的数据之间建⽴连接,他可以是⼀列也可以是多列。

⼀个表中可以有⼀个或多个外键。

⼀个表的外键可以是空值,若不为空值,则每⼀个外键值必须等于另外⼀个表中的主键的某个值。

外键是⼀个表中的字段,他可以不是本表中的主键,但对应另外⼀个表的主键,外键的作⽤是保证数据引⽤的完整性。

定义完外键后,不允许删除在另⼀表中具有关联的⾏。

列如:部门表tb_dept的主键是id,在员⼯表tb_emp5中有⼀个键deptId跟这个id关联。

主表(⽗表):对于两个有关联的表⽽⾔,相关字段中主键所在的那个表为主表。

从表(⼦表):对于两个有关联的表⽽⾔,相关字段中的外键所在的那个表为从表。

外键名:定义外键约束的名称,⼀个表中不能有相同名称的外键。

字段名:表⽰从表需要添加外键约束的字段列。

主表名:即被从表外键所依赖的表的名称主键列:表⽰主表中定义的主键字段,或者字段组合。

ON DELETE 和 ON UPDATE :指定在发⽣删除或更改的表中。

例⼦:创建⼀个部门表tb_dept1,表结构SQL语句如下:CREATE TABLE tb_dept1(id INT PRIMARY KEY,name VARCHAR(22) NOT NULL,location VARCHAR(50) NULL);定义数据表tb_emp6,让它的键deptId作为外键关联到tb_dept1的主键id,SQL语句如下:CREATE TABLE tb_emp6(id INT PRIMARY KEY,name VARCHAR(25),deptId INT,salary FLOAT,CONSTRAINT fk 员⼯部门编号 FOREIGN KEY(deptId) REFERENCES tb_dept1(id));在未设外键表中添加外键可以使⽤ALTER语句将FOREIGN KEY约束添加到该表中,添加主键的ALTER语句语法格式如下 CREATE TABLE tb_emp6(id INT PRIMARY KEY,name VARCHAR(25),deptId INT,salary FLOAT)--创建表但未添加外键后期添加外键SQL语法如下:GOALTER TABLE tb_emp6ADDCANSTRAINT fk 员⼯不猛编号FOREIGN KEY(deptId) REFERENCES tb_dept1(id)删除外键约束删除tb_emp6表中创建的 “fk_员⼯部门编号”外键约束,输⼊语句如下:ALTER TABLE tb_emp6DROP CONSTRAINT fk_员⼯部门编号;执⾏完成后将删除tb_emp6的外键约束。

在sql server2008数据库中创建主外键

在sql server2008数据库中创建主外键

设置主、外键的方法1、主键的设置(1)设置gl22class表的主键如图1所示。

在gl22class表名上单击右键,选择设计命令,如A 处所示。

打开右边的窗口,用鼠标单击要设置的关键字class_id的最左边箭头,如B处所示。

最后单击主键,如C处所示。

A图1如果设置成功,如图2中A处所示。

最后单击保存按钮。

如B处所示。

图2(2)设置gl22course 表的主键 和(1)设置class 表的主键的方法是一样的。

Course 表的关键字是course_id 。

最后单击保存按钮。

(3)设置gl22department 表的主键和(1)设置class 表的主键的方法是一样的。

department 表的关键字是dept_id 。

最后单击保存按钮。

(4)设置gl22student 表的主键和(1)设置class 表的主键的方法是一样的。

student 表的关键字是student_id 。

最后单击保存按钮。

(5)设置gl22grade 表的主键和(1)设置class 表的主键的方法是一样的。

grade 表的关键字是student_id 和course_id 。

这两个属性要同时设置,设置方法是:按下shift 键,用鼠标单击A 处和B 处。

同时选中后,单击C 处。

最后单击保存按钮。

图32、外键的设置(1)gl22class表和gl22department表设置外键如图4所示。

在gl22class表上单击右键选择设计命令。

打开右边A处所示。

打开如图5所示的窗口。

图4在图5中单击添加按钮,用鼠标单击表和列规范,出现A处的按钮,单击A处按钮,打开如图6所示的窗口。

图5图6如图6所示,选择相应表名和字段名。

单击确定按钮。

在图7中单击关闭按钮。

图7图7中单击保存按钮,出现如图8所示的界面。

单击是按钮。

外键设置成功。

图8(2)gl22student表和gl22class表设置外键在gl22student表上单击右键选择设计命令。

SQL中的主键和外键

SQL中的主键和外键

主键与外键一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结一下:主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。

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

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

二、主键、外键和索引的区别收藏聚集索引和非聚集索引的区别?聚集索引一定是唯一索引。

但唯一索引不一定是聚集索引。

聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。

三、数据库中主键和外键的设计原则主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。

主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。

而主键和外键的结构是这个设计过程的症结所在。

一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

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

主键在物理层面上只有两个用途:1. 惟一地标识一行。

mysql外键(ForeignKey)介绍和创建外键的方法

mysql外键(ForeignKey)介绍和创建外键的方法

mysql外键(ForeignKey)介绍和创建外键的⽅法
在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(⽆动作,默认的)。

sql定义外键的方法

sql定义外键的方法

sql定义外键的方法1.建表:```SQLCREATE TABLE PersonsP_Id int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARYKEY(P_Id)```2.在事务中定义外键:```SQLBEGINTRANSACTION;ALTER TABLE PersonsADD CONSTRAINT fk_PerOrdersFOREIGNKEY(P_Id)REFERENCES Orders (P_Id);COMMIT;```完整例子:```SQLCREATE TABLE PersonsP_Id int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARYKEY(P_Id)CREATE TABLE OrdersO_Id int NOT NULL,OrderNo int NOT NULL,P_Id int,PRIMARYKEY(O_Id),FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) BEGINTRANSACTION;ALTER TABLE PersonsADD CONSTRAINT fk_PerOrdersFOREIGNKEY(P_Id)REFERENCES Orders (P_Id);COMMIT;```解释:首先,创建实体表 Persons 和 Orders其中 Persons 表中的 P_Id 为主键,而 Orders 表中的 P_Id 是外键,它引用 Persons 表中的 P_Id 列。

然后,我们在事务中定义外键,使用ALTERTABLE语句其中我们指定外键的名称为“fk_PerOrders”,这将作为外键的元数据标识符。

【转】mysql创建外键sql语句

【转】mysql创建外键sql语句

【转】mysql创建外键sql语句定义数据表假如某个电脑⽣产商,它的数据库中保存着整机和配件的产品信息。

⽤来保存整机产品信息的表叫做 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),即这个键的参照值来⾃于其他表。

SQL建立数据库主键外键

SQL建立数据库主键外键

SQL建⽴数据库主键外键SET FOREIGN_KEY_CHECKS=0;#取消外键约束,Mysql中如果表和表之间建⽴的外键约束,则⽆法删除表及修改表结构。

DROP TABLE IF EXISTS `custinfo`;CREATE TABLE `custinfo` (`custID` varchar(19) NOT NULL COMMENT '客户号',`name` varchar(10) NOT NULL COMMENT '姓名',`sex` varchar(10) NOT NULL COMMENT '性别',`phone` varchar(20) NOT NULL COMMENT '⼿机号',`ID` varchar(19) DEFAULT NULL COMMENT '⾝份证号',`districtID` varchar(19) DEFAULT NULL COMMENT '区ID',`age` varchar(6) NOT NULL COMMENT '年龄',PRIMARY KEY (`custID`),KEY `FK_districtID_1` (`districtID`),CONSTRAINT `FK_districtID_1` FOREIGN KEY (`districtID`) REFERENCES `area_dim` (`districtID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户信息表';-- ------------------------------ Records of custinfo-- ----------------------------BEGIN;INSERT INTO `custinfo` VALUES ('1', '闫⼀⼀', '男', '136********', '567891321242345618', '10101', '18');INSERT INTO `custinfo` VALUES ('2', '朱三枪', '男', '136********', '567891984242345618', '20101', '28');INSERT INTO `custinfo` VALUES ('3', '姜为民', '男', '136********', '567891322489345618', '20101', '18');INSERT INTO `custinfo` VALUES ('4', '刘德华', '男', '136********', '567891989909345618', '30201', '28');INSERT INTO `custinfo` VALUES ('5', '张三三', '⼥', '136********', '567891322489349898', '30201', '18');INSERT INTO `custinfo` VALUES ('6', '刘思思', '男', '136********', '567891989909349007', '30201', '28');COMMIT;-- ------------------------------ Table structure for `cardinfo`-- ----------------------------DROP TABLE IF EXISTS `cardinfo`;CREATE TABLE `cardinfo` (`acct_no` varchar(19) NOT NULL COMMENT '账户',`balance` varchar(19) NOT NULL COMMENT '账号余额',`acct_status` varchar(19) NOT NULL COMMENT '账号状态',`openDate` varchar(19) NOT NULL COMMENT '开卡时间',`openmoney` varchar(19) NOT NULL COMMENT '开卡⾦额',`custID` varchar(19) NOT NULL COMMENT '客户号',`districtID` varchar(19) NOT NULL COMMENT '开户所在区ID',PRIMARY KEY (`acct_no`),KEY `FK_districtID` (`districtID`),KEY `FK_custID` (`custID`),CONSTRAINT `FK_districtID` FOREIGN KEY (`districtID`) REFERENCES `area_dim` (`districtID`),CONSTRAINT `FK_custID` FOREIGN KEY (`custID`) REFERENCES `custinfo` (`custID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='银⾏卡信息表';-- ------------------------------ Records of cardinfo-- ----------------------------BEGIN;INSERT INTO `cardinfo` VALUES ('1010357612121001', '888888', '1', '2019-07-19 08:49:37', '1.00', '1', '10101');INSERT INTO `cardinfo` VALUES ('1010357612121002', '888888', '1', '2019-07-18 08:49:37', '2.00', '2', '20101');INSERT INTO `cardinfo` VALUES ('1010357612121003', '888888', '0', '2019-07-19 08:49:37', '3.00', '3', '20101');INSERT INTO `cardinfo` VALUES ('1010357612121004', '888888', '1', '2019-07-19 08:49:37', '1.00', '1', '10101');INSERT INTO `cardinfo` VALUES ('1010357612121005', '888888', '1', '2019-07-18 08:49:37', '2.00', '2', '20101'); COMMIT;DROP TABLE IF EXISTS `area_dim`;CREATE TABLE `area_dim` (`districtID` varchar(19) NOT NULL COMMENT '区域ID',`area_name` varchar(19) NOT NULL COMMENT '区域名',`city_id` varchar(19) NOT NULL COMMENT '城市ID',`city_name` varchar(19) NOT NULL COMMENT '城市名',`province_id` varchar(19) DEFAULT NULL COMMENT '省ID',`province_name` varchar(19) DEFAULT NULL COMMENT '省名',PRIMARY KEY (`districtID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='区域码值表';-- ------------------------------ Records of area_dim-- ----------------------------BEGIN;INSERT INTO `area_dim` VALUES ('10101', '⼆七区', '101', '郑州市', '1', '河南省');INSERT INTO `area_dim` VALUES ('20101', '⾼新区', '201', '青岛市', '2', '⼭东省');INSERT INTO `area_dim` VALUES ('30201', '新区', '301', '⽯家庄市', '3', '河北省');COMMIT;SET FOREIGN_KEY_CHECKS = 1; #设置外检约束注:将同⼀个字段设置成2个表的外键时,2次的外键名应不同。

SQL中主键、外键完整性约束的作用以及创建语句

SQL中主键、外键完整性约束的作用以及创建语句

SQL中主键、外键完整性约束的作用以及创建语句
SQL的主键和外键约束
SQL的主键和外键的作用:
外键取值规则:空值或参照的主键值。

(1)插入非空值时,如果主键表中没有这个值,则不能插入。

(2)更新时,不能改为主键表中没有的值。

(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。

(4)更新主键记录时,同样有级联更新和拒绝执行的选择。

简而言之,SQL的主键和外键就是起约束作用。

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。

比如:
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键;
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键;
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。

SQL的主键和外键的作用

SQL的主键和外键的作用

SQL的主键和外键约束SQL的主键和外键的作用:外键取值规则:空值或参照的主键值。

(1)插入非空值时,如果主键表中没有这个值,则不能插入。

(2)更新时,不能改为主键表中没有的值。

(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。

(4)更新主键记录时,同样有级联更新和拒绝执行的选择。

简而言之,SQL的主键和外键就是起约束作用。

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。

比如:学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键;课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键;成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。

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

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

身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。

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

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

二、主键、外键和索引的区别定义:主键--唯一标识一条记录,不能有重复的,不允许为空外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值索引--该字段没有重复值,但可以有一个空值作用:主键--用来保证数据完整性外键--用来和其他表建立联系用的索引--是提高查询排序的速度个数:主键--主键只能有一个外键--一个表可以有多个外键索引--一个表可以有多个唯一索引创建SQL的主键和外键约束的方法:create table Student --建表格式:create table 自定义的表名(--字段名一般为有一定意义的英文StudentName nvarchar(15),-- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int,--int型的后面不需要接长度StudentSex nvarchar(2)--最后一个字段后面不要逗号)--在创建表时就可以对字段加上约束:create table Student(StudentNo int PRIMARY KEY IDENTITY(1,1),--加主键约束,还有标识列属性(两者构成实体完整性)StudentName nvarchar(15)not null,--加非空约束,不加"not null" 默认为:可以为空StudentSchool text(20)FOREIGN KEY REFERENCES SchoolTable(SchoolName) ,--加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)StudentAge int DEFAULT((0)),--加默认值约束StudentSex nvarchar(2)CHECK(StudentSex=N'男'or StudentSex=N'女')--加检查约束,格式:check (条件表达式))--如果在表创建好了以后再加约束,则格式分别为:-- 主键:alter table表名add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名primary key(字段名)--字段名同上--唯一约束:alter table表名add constraint UQ_字段名unique(字段名)--外键约束:alter table表名add constraint FK_字段名--"FK"为外键的缩写foreign key(字段名)references关联的表名(关联的字段名)--注意'关联的表名'和'关联的字段名'alter table表A add constraint FK_B foreign key(ticket_no)references表B(ticket_no)alter table表A add constraint FK_C foreign key(person_no)references表C(person_no)alter table成绩表add constraintFK_StudentNo foreign key (StudentNo)references Student (StudentNo) ON UPDATE CASCADE ON DELETE CASCADE级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。

SQL外键——精选推荐

SQL外键——精选推荐

SQL外键先新建2个表,写⼊数据-- 创建测试主表. ID 是主键.CREATE TABLE test_main (id INT,value VARCHAR(10),PRIMARY KEY(id));-- 创建测试⼦表.CREATE TABLE test_sub (id INT,main_id INT,value VARCHAR(10),PRIMARY KEY(id));-- 插⼊测试主表数据.INSERT INTO test_main(id, value) VALUES (1, 'ONE');INSERT INTO test_main(id, value) VALUES (2, 'TWO');-- 插⼊测试⼦表数据.INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');默认外键约束⽅式ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;添加外键后,在删除数据(运⾏结果会提⽰错误,因为test_mian的数据已经给test_sub使⽤)DELETE test_main WHERE ID =1;测试完毕后,删除外键约束ALTER TABLE test_sub DROP CONSTRAINT main_id_cons;DELETE CASCADE ⽅式-- 创建外键(使⽤ ON DELETE CASCADE 选项,删除主表的时候,同时删除⼦表)ALTER TABLE test_sub ADD CONSTRAINT main_id_consFOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;测试删除(删除成功后select查看2表运⾏结果)DELETE test_main WHERE ID =1;测试完毕后,删除外键约束ALTER TABLE test_sub DROP CONSTRAINT main_id_cons;UPDATE CASCADE⽅式--更新主表的主键时候,同时更新⼦表外键ALTER TABLE test_subADD CONSTRAINT main_id_consFOREIGN KEY (main_id) REFERENCES test_main ON UPDATE CASCADE;SET NULL⽅式-- 创建外键(使⽤ ON DELETE SET NULL 选项,删除主表的时候,同时将⼦表的 main_id 设置为 NULL)ALTER TABLE test_subADD CONSTRAINT main_id_consFOREIGN KEY (main_id) REFERENCES test_main ON DELETE SET NULL;SET DEFAULT ⽅式--为了更容易理解, SET DEFAULT ⽅式使⽤下⾯这样的测试表与测试数据.-- 创建测试主表. ID 是主键.-- 班级表.CREATE TABLE test_main_class (id INT NOT NULL,value VARCHAR(20),PRIMARY KEY(id));-- 创建测试⼦表.-- 学⽣表.CREATE TABLE test_sub_student (id INT NOT NULL,main_id INT DEFAULT0,value VARCHAR(10),PRIMARY KEY(id));-- 插⼊测试主表数据.INSERT INTO test_main_class(id, value) VALUES (0, '暂⽆班级');INSERT INTO test_main_class(id, value) VALUES (1, '2013级1班');INSERT INTO test_main_class(id, value) VALUES (2, '2013级2班');-- 插⼊测试⼦表数据.INSERT INTO test_sub_student(id, main_id, value) VALUES (1, 1, '张三');INSERT INTO test_sub_student(id, main_id, value) VALUES (2, 2, '李四');--⾸先测试 ON DELETE SET DEFAULTALTER TABLE test_sub_studentADD CONSTRAINT fk_main_classFOREIGN KEY (main_id) REFERENCES test_main_class ON DELETE SET DEFAULT;SELECTtest_main_class.value AS "班级",test_sub_student.value AS "学⽣"FROMtest_main_classJOIN test_sub_studentON(test_main_class.id = test_sub_student.main_id);--班级学⽣-------------------- ------------2013级1班张三--2013级2班李四DELETE FROM test_main_class WHERE ID =1;SELECTtest_main_class.value AS "班级",test_sub_student.value AS "学⽣"FROMtest_main_classJOIN test_sub_studentON(test_main_class.id = test_sub_student.main_id);--班级学⽣-------------------- ------------暂⽆班级张三--2013级2班李四ON DELETE SET DEFAULT指定如果试图删除某⼀⾏,⽽该⾏的键被其他表的现有⾏中的外键所引⽤,则组成被引⽤⾏中的外键的所有值将被设置为它们的默认值。

SQL-外键-三大范式(关系型数据库)-ER模型

SQL-外键-三大范式(关系型数据库)-ER模型

SQL-外键-三⼤范式(关系型数据库)-ER模型外键:通常使⽤主键作为外键,也可以使⽤唯⼀标记⾏的多个列作为外键;
外键约束:为了维护表数据的完整(正确)性:
ALTER TABLE Student
ADD CONSTRAINT FK_Teacher_Id --添加约束及约束名
FOREIGN KEY (TeacherId) --约束类型:外键,外键列为TeacherId
REFERENCES Teacher(Id) --外键表为Teacher,外键列为Teacher上的Id
外键约束包括:
1,在主表上添加/修改数据时,不能使⽤从表上不存在的外键值;
2,在从表上更改/删除外键值时,确保该值未被主表外键引⽤;
主表上的外键可以为null,可以重复;
当两张表建⽴主/从关系,要注意操作数据的顺序:
1,增:先从表,再主表
2,删:先改主表外键,再删从表
3,改:没有顺序,但主/从表要⼀致
三⼤范式:
⽬的:减少冗余,保证数据库的⼀致性;
1,关系中的每个属性都不可再分
2,⼀⾏数据,所有⾮主键列都只有对主键完全依赖
3,在第⼆式基础上消除传递依赖
ER模型:
在关系型数据库上实现的,分为:
实体:由属性组成,通常就是⼀⾏数据;
属性:实体的特征,表现成列;
关系:实体与实体之间的关联;
所有关系被抽象为三类:
⼀对⼀(⼀个学⽣,有且仅有⼀个详细地址);
⼀对多(⼀个学⽣,有年龄,性别,⾝⾼,体重等);
多对多(⼀个学⽣有多个⽼师,⼀个⽼师有多个学⽣);。

SQL中主键、外键完整性约束的作用以及创建语句

SQL中主键、外键完整性约束的作用以及创建语句

SQL中主键、外键完整性约束的作用以及创建语句SQL的主键和外键约束SQL的主键和外键的作用:外键取值规则:空值或参照的主键值。

(1)插入非空值时,如果主键表中没有这个值,则不能插入。

(2)更新时,不能改为主键表中没有的值。

(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。

(4)更新主键记录时,同样有级联更新和拒绝执行的选择。

简而言之,SQL的主键和外键就是起约束作用。

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。

比如:学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键;课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键;成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。

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

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

身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。

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

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

二、主键、外键和索引的区别定义:主键--唯一标识一条记录,不能有重复的,不允许为空外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值索引--该字段没有重复值,但可以有一个空值作用:主键--用来保证数据完整性外键--用来和其他表建立联系用的索引--是提高查询排序的速度个数:主键--主键只能有一个外键--一个表可以有多个外键索引--一个表可以有多个唯一索引创建SQL的主键和外键约束的方法:create table Student --建表格式:create table 自定义的表名( --字段名一般为有一定意义的英文StudentName nvarchar(15), -- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int, --int型的后面不需要接长度StudentSex nvarchar(2) --最后一个字段后面不要逗号)--在创建表时就可以对字段加上约束:create table Student(StudentNo int PRIMARY KEY IDENTITY(1,1), --加主键约束,还有标识列属性(两者构成实体完整性)StudentName nvarchar(15) not null, --加非空约束,不加"not null" 默认为:可以为空StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)StudentAge int DEFAULT ((0)), --加默认值约束StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女') --加检查约束,格式:check (条件表达式))--如果在表创建好了以后再加约束,则格式分别为:-- 主键:alter table 表名add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名primary key (字段名) --字段名同上--唯一约束:alter table 表名add constraint UQ_字段名unique (字段名)--外键约束:alter table 表名add constraint FK_字段名--"FK"为外键的缩写foreign key (字段名) references 关联的表名(关联的字段名) --注意'关联的表名'和'关联的字段名'alter table 表A add constraint FK_B foreign key (ticket_no) references 表B(ticket_no)alter table 表A add constraint FK_C foreign key (person_no) references 表C(person_no)alter table 成绩表add constraint FK_StudentNo foreign key (StudentNo) references Student (StudentNo)ON UPDATE CASCADE ON DELETE CASCADE级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档