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時,成績表中該學生的所有成績都會删除。
--檢查限制:
alter table 表名
add constraint CK_字段名
check (條件表達式) --條件表達式中的條件用關系運算符連接配接
--預設值限制:
alter table 表名
add constraint DF_字段名
default '預設值' for 字段名--其中的'預設值'為你想要預設的值,注意'for'
--删除建立的限制:
alter table 表名
drop constraint 限制名--限制名為你前面建立的如:PK_字段這樣的限制名
--注意:如果限制是在建立表的時候建立的,則不能用指令删除
--隻能在'企業管理器'裡面删除
-- 擷取SqlServer中表結構
SELECT syscolumns.name,systypes.name,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,
sysobjects.name constraintName, sysobjects.xtype AS constraintType,
syscolumns.name 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'
MySQL:
mysql建表語句是最基礎的SQL語句之一,下面就為您介紹最常用的三種MySQL建表語句,如果您對MySQL建表語句方面感興趣的話,不妨一看。
1、最簡單的:
CREATE TABLE t1(
id int not null,
name char(20)
);
2、帶主鍵的:
a:
CREATE TABLE t1(
id int not null primary key,
name char(20)
);
b:複合主鍵
CREATE TABLE t1(
id int not null,
name char(20),
primary key (id,name)
);
3、帶預設值的:
CREATE TABLE t1(
id int not null default 0 primary key,
name char(20) default '1'
);