sql server中建立外键约束有3中方式:enterprise manager中,tables,design table,设置table的properties,可以建立constraint, reference key;enterprise manager中,diagrams, new diagrams,建立两个表的关系;直接用transact sql语句。
1、三个方法都需要先建立数据表。
1)创建表author :
create table [dbo][author] (
[id] [bigint] not null ,
[authorname] [char] (10) null ,
[address] [char] (480) null ,
[introduction] [ntext] null
)
2)创建表mybbs:
reate table [dbo][mybbs] (
[id] [bigint] identity (1, 1) not null ,
[authorid] [bigint] not null ,
[title] [char] (40) null ,
[date_of_created] [datetime] null ,
[abstract] [char] (480) null ,
[content] [ntext] null
)
2、设置表mybbs中的authorid为外键,参照author表的id字段,直接使用transact sql语句,过程如下:
1)增加表mybbs(authorid)的外键约束fk_mybbs_author,表mybbs中的authorid受表author中的主键id约束:
begin transaction
alter table dbomybbs add constraint fk_mybbs_author
foreign key (authorid)
references dboauthor([id]) on update cascade on delete cascade
2)删除外键约束fk_mybbs_author:
--alter table dbomybbs drop constraint fk_mybbs_author
--rollback
commit transaction
上面on update cascade,on delete cascade两个选项,指明以后author表的id字段有delete,update *** 作时,mybbs表中的id也会被级联删除或更新。如果没有选中,是不可以对author表中已被mybbs表关联的id进行update或者delete *** 作的。
:SQL的主键和外键的作用:
1、插入非空值时,如果主键表中没有这个值,则不能插入。
2、更新时,不能改为主键表中没有的值。
3、删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
4、更新主键记录时,同样有级联更新和拒绝执行的选择。
简而言之,SQL的主键和外键就是起约束作用。
这里,你要理解主键和外键的基本含义,简单来说就是:
1、主键是用来唯一地标识一行数据。主键列必须包含唯一的值,且不能包含空值(null)。
2、外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
你的后面外键的定义可以错误报错信息已经很清楚的告诉你问题在哪了,在被引用表 'staff' 中没有与外键 'fk_room_sID_staff_sID' 中的引用列列表匹配的主键或候选键。,你的staff表是复合主键,但是你外键定义时没有加上所有主键码,这样的外键是无法创建成功的。
原因还是从上面主外键定义来分析,主外键最终数据都是同步级联更新的,你的定义不同步,就会导致你没法更新,举个例子
表1(列1, 列2)主键列1,列2
表2(列A,列B)外键列A对应主键码 列1
如果是这样定于的话,当你删除表2记录时,因为时级联删除,表1可能会删除掉其他不需要删除的信息,因为不是根据表1主键删除的。
你按照各表主键去重新修改定义下你的外键问题就解决了。
constraint是约束关键字,后面[]中的是约束名,然后primary key又是关键字,[user_id]指定字段
约束定义的格式:
constraint 约束名 约束类型 字段/表达式
例如:
1
constraint ch_1 check (sal>2000);
--这个ch_1约束是自动检查sal是否大于2000
2
constraint fk_1 foreign key (字段1) references table1(字段2);
--定于外键约束:该表的字段1参照table1表中的字段2
--部门信息表
create table Departments
(
d_id int not null primary key,
d_name varchar(20) not null,
)
use POS
--员工信息表
create table employee
(
e_id int not null primary key,
ename varchar(10) not null,
esex char(2) not null,
constraint CK_yg check ( esex in('男','女')),
eduties varchar(10) not null,
epassword int not null,
eleve char(4) not null,
eshengfen int not null,
d_id int not null,
constraint FK_ano foreign key(d_id) references Departments(d_id)
)
--供应商信息表
create table offer
(
o_id int not null primary key,
oname varchar(10) not null,
oaddress varchar(20) not null,
post int not null,
phonenumber int not null,
tax int not null,
obanknumber int not null,
obank varchar(20) not null,
ocontact varchar(10) not null,
onote varchar(20)
)
--会员信息表
create table Member
(
Mno int not null primary key,
Mname varchar(10) not null,
Msex char(2) not null,
constraint CK_ya check ( Msex in('男','女')),
Mid int not null,
Mamount money not null,
Mintegral int not null
)
--商品信息表
create table product
(
p_id int not null primary key,
pclass varchar(20) not null,
pquantity int not null,
pprice money not null,
pname varchar(10) not null
)
--入库信息表
create table import
(
i_id int identity(0 ,1) not null primary key ,
idate datetime ,
p_id int ,
constraint FK_an foreign key(p_id) references product(p_id),
Punit int ,
iprice money,
Sales_price money ,
iquantity int,
Total_amount money,
o_id int ,
constraint FK_cn foreign key(o_id) references offer(o_id),
Salesman_No int ,
constraint FK_on foreign key(Salesman_No) references employee(e_id)
)
--销售出货单主信息表
create table xiaoshouzhu
(
xdate datetime not null,
xtotal_amount money not null,
xsfxj char(2) not null,
xsfmember char(2) not null,
Mno int not null,
constraint FK_ak foreign key(Mno) references Member(Mno),
MRsyybh int not null,
constraint FK_ek foreign key(MRsyybh) references employee(e_id)
)
--销售出货单子信息(
create table xiaoshouzi
(
xzRno int not null,
quantity int not null,
price money not null,
zkbl float not null,
amount money not null
)
--1当在商品信息表中添加一条商品信息时,同时将该商品信息记录在入库信息表中(触发器)
create trigger triger_1
on product
after insert
as
begin
declare @a int, @b varchar(20),@c int,@d money, @e varchar(20)
select @a = p_id ,@b = pclass,@c = pquantity , @d = pprice ,@e = pname from inserted
insert into import(idate,p_id,Punit,iprice,Sales_price,iquantity,Total_amount,p_id,Salesman_No)
values (null ,@a , null , null,@d, @c ,null , null,null)
end
--2销售一件商品时,将该销售信息记录在销售出货单子信息表中,并从入库信息表中将对应产品的数量减一(触发器)
create trigger triger_2
on xiaoshouzi
after insert
as
begin
update import
set iquantity = (iquantity -1)
where p_id =(select p_id from inserted)
end
--3撤消某部门时,将该部门记录从部门表中删除,并将员工表中对应该部门的员工记录删除(触发器)
create trigger triger_3
on Departments
after delete
as
begin
delete employee
where d_id = (SELECT d_id from deleted)
end
--4当更新商品信息表中商品单价时,同时更改入库信息表中对应商品的销售价格(触发器)
create trigger triger_4
on product
after update
as
begin
update import
set Sales_price = (select pprice from inserted)
where p_id = (select p_id from deleted )
end
--5向销售出货单子信息表中添加一条信息,并输出表中商品总金额。(存储过程)
create procedure productpricing_1
@total_amount money output,
@a int,
@b int,
@c money,
@d float,
@e money
as
begin
insert into xiaoshouzi
values (@a , @b ,@c ,@d ,@e);
select @total_amount = (price quantity) from xiaoshouzi
end
--6输出副食类商品的入库平均价格。(存储过程)
create procedure productpricing_2
@avg_price money output
as
begin
select @avg_price = avg(pprice)
from product
where pname = '副食类'
end
--7输出收银员“刘明”在2010年3月6号销售的商品总金额(存储过程)
create procedure productpricing_3
@total_amount money output
as
begin
select @total_amount = DRtotal_amount
from xiashouzhu , employee
where xiaoshouzhuMRsyybh = employeee_id and employeeename = '刘明' and xiaoshouzhuxdate = '2010年3月6号'
end
CONSTRAINT METHOD_AGENTTYPE CHECK--创建约束((PUBLICEM_CATEGORY_METHODSAGENTTYPE) IN (('jmx:rmi'),('jmx:t3'),('ssh'),('socket'))),
--AGENTTYPE是(('jmx:rmi'),('jmx:t3'),('ssh'),('socket'))),中的一个
CONSTRAINT FK_METHOD_CATEGORY FOREIGN KEY--创建外键(CATEG_ID) REFERENCES PUBLICEM_CATEGORIES(CATEGORYID))CATEG_ID是外键被参照的表是EM_CATEGORIES,被参照的列是CATEGORYID
以上就是关于sql怎么设置外键全部的内容,包括:sql怎么设置外键、SQL数据库问题(为什么我后面四个运行不了啊)求救、sql server 2005建表语句有句不明白等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)