SQL Server外键设置笔记
sql server 的 foreign key 语法

sql server 的foreign key 语法
在 SQL Server 中,外键(Foreign Key)用于确保在一个表中的数据与另一个表中的数据相匹配。
FOREIGN KEY约束用于防止破坏表之间关系的操作。
FOREIGN KEY 是一张表中的字段(或字段集合),它引用另一张表中的主键。
具有外键的表称为子表,具有主键的表称为被引用表或父表。
外键语法如下:
创建表时添加外键约束:
在已有表中添加外键约束:
删除外键约束:
如需定义多个列的FOREIGN KEY约束,使用下面的SQL语法
字段2 varchar(255) NOT NULL,
字段3 varchar(255),
CONSTRAINT 外键名 FOREIGN KEY (字段1) REFERENCES 外表(字段1)
)
举例说明:
UNIQUE约束唯一标识数据库表中的每条记录。
Persons表
以下SQL 在创建"Orders"表时在"PersonID"列上创建了一个FOREIGN KEY:CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
OrderNumber int NOT NULL,
PersonID int FOREIGN KEY REFERENCES Persons(PersonID) );。
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 在维护索引、外键和字段方面的常见语法。
SQLServer语句创建数据库和表——并设置主外键关系

SQLServer语句创建数据库和表——并设置主外键关系简单的创建数据库的 SQL 语句:1use master2go34if exists(select*from sysdatabases where name='Test')5begin6select'该数据库已存在'7drop database Test --如果该数据库已经存在,那么就删除它8end9else10begin11create database Test12on primary--表⽰属于 primary ⽂件组13 (14 name='stuDB_data', -- 主数据⽂件的逻辑名称15 filename='D:\stuDB_data.mdf', -- 主数据⽂件的物理名称16 size=5mb, --主数据⽂件的初始⼤⼩17 maxsize=100mb, -- 主数据⽂件增长的最⼤值18 filegrowth=15%--主数据⽂件的增长率19 )20log on21 (22 name='stuDB_log', -- ⽇志⽂件的逻辑名称23 filename='D:\stuDB_log.ldf', -- ⽇志⽂件的物理名称24 size=2mb, --⽇志⽂件的初始⼤⼩25 maxsize=20mb, --⽇志⽂件增长的最⼤值26 filegrowth=1mb --⽇志⽂件的增长率27 )28end接下来是创建数据表的 SQL 语句:1use Test --表⽰设置为在该数据库(Test)执⾏下⾯的SQL语句2go可以先执⾏⼀下以上语句。
或者在这⾥选择数据库。
1use Test --表⽰设置为在该数据库(Test)执⾏下⾯的SQL语句2go34if exists(select*from sysobjects where name='Student')5begin6select'该表已经存在'7drop table Student --删除表8end9else10begin11create table Student12 (13 S_Id int not null identity(1,1) primary key, --设置为主键和⾃增长列,起始值为1,每次⾃增114 S_StuNo varchar(50) not null,15 S_Name varchar(20) not null,16 S_Sex varchar(10) not null,17 S_Height varchar(10) null,18 S_BirthDate varchar(30) null19 )20end2122--添加约束23alter table Student add constraint24 UQ_S_StuNo --约束名25unique--约束类型(唯⼀约束)26 (S_StuNo) --列名2728--删除约束29alter table Student drop constraint30 UQ_S_StuNo --约束名SQL语句创建表变量:1declare@Score table2 (3 Id int not null,4 Name varchar(50) null5 )67insert into@Score8select'1','刘邦'union9select'2','项⽻'1011select*from@ScoreSQL语句创建临时表:1-- ## 表⽰全局临时表2create table ##temp3 (4 Id int not null,5 Name varchar(10) null6 )78-- # 表⽰局部临时表9create table #temp10 (11 Id int not null,12 Name varchar(10) null13 )SQL 语句创建表并设置主外键关系:1if exists(select*from sysObjects where name='Course')2begin3select'该表已经存在'4drop table Course5end6else7begin8create table Course9 (10--列名字段类型是否为空标识外键列(外键列名)关联表的表名(关联的字段名)11 Stu_Id int null foreign key(Stu_Id) references Student(S_Id),12 C_Id int not null identity(1,1) Primary key,13 C_Name varchar(100) not null14 )15end注意:表变量和临时表都不能添加约束,具体的特征和适⽤场景请参见:/kissdodog/archive/2013/07/03/3169470.html。
在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表上单击右键选择设计命令。
SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则

SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则SELECT DISTINCTTOP 100 PERCENT isnull(,'') AS ⽗对象, o.xtype,CASE o.xtype WHEN 'C' THEN 'CHECK 约束' WHEN 'D' THEN '默认值或DEFAULT约束'WHEN 'F' THEN 'FOREIGNKEY约束' WHEN 'L' THEN '⽇志' WHEN 'FN' THEN '标量函数'WHEN 'IF' THEN '内嵌表函数' WHEN 'P' THEN '存储过程' WHEN 'PK' THEN 'PRIMARYKEY约束'WHEN 'RF' THEN '复制筛选存储过程' WHEN 'S' THEN '系统表' WHEN 'TF' THEN '表函数'WHEN 'TR' THEN '触发器' WHEN 'U' THEN '⽤户表' WHEN 'UQ' THEN 'UNIQUE 约束'WHEN 'V' THEN '视图' WHEN 'X' THEN '扩展存储过程' WHEN 'R' THEN '规则' ELSE NULLEND AS 类型, AS 对象名, o.crdate AS 创建时间, o.refdate AS 更改时间,c.text AS 声明语句,OBJECTPROPERTY(o.id, N'IsMSShipped')FROM dbo.sysobjects o Left JOINdbo.sysobjects p ON o.parent_obj = p.id LEFT OUTER JOINdbo.syscomments c ON o.id = c.idWHERE --(o.xtype IN ('C','D','F','PK','UQ','L','FN','IF','TF','TR','P','R','RF','X','S','U','V')) AND(OBJECTPROPERTY(o.id, N'IsMSShipped') = 0) AND (isnull(,'') <> N'dtproperties')ORDER BY o.xtype DESC。
SQL关于外键和主键的理解

use mastergoif exists (select * from sysobjects where name='player')drop table Weapon--武器表(主表)create table Weapon(WeaponID int identity(1,1) primary key,Wnane varchar(20) not null)--绝技表(主表)if exists (select * from sysobjects where name='Skill')drop table Skillcreate table Skill( SkillID int identity(1,1) primary key,Sname varchar(20)not null unique)if exists (select * from sysobjects where name='player')drop table player--选手表(子表)create table player( pid int identity(1,1) primary key,pname varchar(20) not null,weaponid int foreign key references Weapon(WeaponID),--字表中(player)有两个外键存在,skillid int foreign key references Skill(SkillID)--它们所对应的主表是)--也可以这样理解只有在子表中存在外键--给几张表赋值--武器表,先用一次只添加一条数据的方法来添加insert into Skill values('我用流拳法')--一次添加多条数据insert into Skillselect '射击' unionselect '我流星格斗技' unionselect '杰夫流喧哗杀法'unionselect '骨法'select * from Skill -- 此表中存在SkillID为2或者WeaponID为2,所以在可以把skillid和weaponid全部修改为2--如果修改为除了1,2,3,5,6的值将不会修改成功--向Weapon表中添加数据insert into Weaponselect '枪' unionselect '铁锤' unionselect '棍' unionselect '扇子' unionselect '花拳秀腿'select * from Weapon-- 道理同上--向player(子表)添加数据insert into playerselect '李小龙', 1,2(主表中一定存在一个2这样的值,子表中才能添加) union select '后裔', 2,3 unionselect '金轮法王',3,4 unionselect '郭芙荣', 4,5 unionselect '洪七公', 6,1select * from player--修改IDupdate player set WeaponID=5update player set SkillID=5select * from player--可以修改player(子表)中weaponid(外键列)和skillid(外键列)--因为它们两个是子表2中的列weaponid和列skillid不能修改主表(Skill)中的SkillID,但可以修改字表中的SkillID,因为主表中的是有表示列存在的不允许被修改的还有外键要添加的数据,一定要在主键中能找到与之对应的才行。
SQLServer主键、外键、唯一等约束

SQLServer主键、外键、唯⼀等约束主键(primary key)约束、外键(foreign key)约束、唯⼀(unique)约束、检查(check)约束、默认值(default)约束实例Oracle 有如下类型的约束:NOT NULL(⾮空)、UNIQUE Key(唯⼀约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)、CHECK约束Oracle使⽤SYS_Cn格式命名约束.创建约束:在建表的同时创建、建表后创建约束的类型有如下⼏种:C (check constraint on a table)P (primary key)U (unique key)R (Referential AKA Foreign Key)V (with check option, on a view)O (with read only, on a view)1、创建约束CREATE TABLE students(student_id VARCHAR2(10) NOT NULL,student_name VARCHAR2(30) NOT NULL,college_major VARCHAR2(15) NOT NULL,status VARCHAR2(20) NOT NULL,state VARCHAR2(2),license_no VARCHAR2(30)) TABLESPACE student_data;2、创建主键:ALTER TABLE students ADD CONSTRAINT pk_students PRIMARY KEY (student_id)USING INDEX TABLESPACE student_index;Alter table table_name add constrants BID primary key (bookno);ALERT TABLE table_name MODIFY( column1 PRIMARY KEY);3、创建Unique约束:ALTER TABLE students ADD CONSTRAINT uk_students_license UNIQUE (state, license_no)USING INDEX TABLESPACE student_index;4、创建Check约束:定义每⼀记录都要满⾜的条件,条件表达式不允许有:CURRVAL, NEXTVAL, LEVEL, ROWNUM,SYSDATE, UID, USER, USERENV 函数:ALTER TABLE students ADD CONSTRAINT ck_students_st_lic CHECK ((state IS NULL AND license_no IS NULL) OR (state IS NOT NULL AND license_no is NOT NULL));添加check约束(check_1为约束名,dept_salary为字段名 ) alter table emp add constraint check_1 check(dept_salary>0); 5、创建外键约束:ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup (state);6. 创建不能为空约束 not nullalter table table_name modify(name not null);alter table table_name modify name1 varchar2(20) not null;实例1:⾸先创建学⽣信息表studentinfo和学⽣成绩表testinfo。
sqlserver2012学习笔记

sqlserver2012学习笔记select ProductID, Name as ProductName, --using an alias'The list price for ' + ProductNumber + ' is′+convert(varchar,ListPrice)+′.′,−−usingtheconcatenationtojoincharacterend−to−end.′Thelistpricefor′+ProductNumber+′is ' + convert(varchar,ListPrice) +'.' as [Description] --using brackets to let SQL server conside the strin as a column namefrom Production.Product在where语句中⽤>,=,<等字符eg:select * from [Sales].[SalesOrderHeader]where SalesPersonID=275select * from [Sales].[SalesOrderHeader]where SalesOrderNumber='so43670' //string类型加单引号where语句中使⽤or或andeg:select SalesOrderID,OrderDate,SalesPersonID,TotalDue as TotalSalesfrom [Sales].[SalesOrderHeader]where SalesPersonID=275 and TotalDue>5000 and Orderdate between '2005-08-01' and '1/1/2006'like中使⽤%号 //%表⽰可以有,可以没有select * from [Production].[Product]where name like'Mountain'select * from [Production].[Product]where name like'%Mountain%' --Wildcard % matches any zero or more characters_下划线表⽰前⾯有⼀个不知道的字符select * from [Production].[Product]where name like'_ountain%'Where语句中使⽤in或not inselect * from [Production].[Product]where color in ('red','white','black')select * from [Production].[Product]where class not in ('H') -- same as using: <> 'H'//没有H的is null 与is not null--Topic 10select * from [Production].[Product]where size is nullselect * from [Production].[Product]where size is not nullor与and的理解Processing math: 100%。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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时,成绩表中该学生的所有成绩都会删除。
--检查约束:
alter table 表名
add constraint CK_字段名
check (条件表达式) --条件表达式中的条件用关系运算符连接
--默认值约束:
alter table 表名
add constraint DF_字段名
default '默认值' for 字段名--其中的'默认值'为你想要默认的值,注意'for'
--删除创建的约束:
alter table 表名
drop constraint 约束名--约束名为你前面创建的如:PK_字段这样的约束名
--注意:如果约束是在创建表的时候创建的,则不能用命令删除
--只能在'企业管理器'里面删除
-- 获取SqlServer中表结构
SELECT ,,syscolumns.isnullable,
syscolumns.length
FROM syscolumns,systypes
WHERE syscolumns.xusertype = systypes.xusertype
AND syscolumns.id = OBJECT_ID('Student')
-- 单独查询表递增字段
SELECT [name] FROM syscolumns WHERE
id = OBJECT_ID(N'Student') AND COLUMNPROPERTY(id,name,'IsIdentity')=1 -- 获取表主外键约束
EXEC sp_helpconstraint 'StuResults'
-- 查询表主键外键信息
SELECT sysobjects.id objectId,OBJECT_NAME(sysobjects.parent_obj) tableName, constraintName, sysobjects.xtype AS constraintType, AS columnName
FROM sysobjects INNER JOIN sysconstraints
ON sysobjects.xtype in('C', 'F', 'PK', 'UQ', 'D')
AND sysobjects.id = sysconstraints.constid
LEFT OUTER JOIN syscolumns ON sysconstraints.id = syscolumns.id
WHERE OBJECT_NAME(sysobjects.parent_obj)='StuResults'。