SQL的主鍵和外來鍵等各種約束

2021-06-26 00:18:10 字數 4690 閱讀 5450

sql

的主鍵和外來鍵的作用:

外來鍵取值規則:空值或參照的主鍵值。 (

1)插入非空值時,如果主鍵表中沒有這個值,則不能插入。 (

2)更新時,不能改為主鍵表中沒有的值。 (

3)刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。 (

4)更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。

簡而言之,

sql的主鍵和外來鍵就是起約束作用。

定義主鍵和外來鍵主要是為了維護關聯式資料庫的完整性,總結一下:

一、主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。

外來鍵用於與另一張表的關聯。是能確定另一張表記錄的字段,用於保持資料的一致性。比如,

a表中的乙個字段,是

b表的主鍵,那他就可以是

a表的外來鍵。

二、主鍵、外來鍵和索引的區別

定義:

主鍵--

唯一標識一條記錄,不能有重複的,不允許為空 外來鍵

--表的外來鍵是另一表的主鍵

, 外來鍵可以有重複的

, 可以是空值 索引

--該欄位沒有重複值,但可以有乙個空值

作用: 主鍵

--用來保證資料完整性 外來鍵

--用來和其他表建立聯絡用的 索引

--是提高查詢排序的速度

個數: 主鍵

--主鍵只能有乙個 外來鍵

--乙個表可以有多個外來鍵 索引

--乙個表可以有多個唯一索引 建立

sql的主鍵和外來鍵約束的方法:

create

table student --

建**式

:create table 

自定義的表名 (

--欄位名一般為有一定意義的英文

studentname nvarchar

(15),

-- 格式:欄位名型別

()括號裡面的是允許輸入的長度

studentage int

,--int

型的後面不需要接長度

student*** nvarchar

(2)--

最後乙個字段後面不要逗號 )

--在建立表時就可以對欄位加上約束:

create

table student (

studentno int

primary

keyidentity

(1,1),

--加主鍵約束

,還有標識列屬性(兩者構成實體完整性)

studentname nvarchar

(15)

notnull,

--加非空約束,不加

"not null" 

預設為:可以為空

studentschool text

(20)

foreign

keyreferences schooltable(schoolname),

--加外來鍵約束,格式

:foreign key references 

關聯的表名

(欄位名)

studentage int

default

((0)),

--加預設值約束

student*** nvarchar

(2)check

(student***=n'男'

or student***=n'女'

)--加檢查約束,格式

:check (

條件表示式)

) --如果在表建立好了以後再加約束,則格式分別為:

-- 主鍵:

alter

table表名

addconstraint pk_

欄位名--"pk"

為主鍵的縮寫,欄位名為要在其上建立主鍵的欄位名

,'pk_

欄位名'

就為約束名

primary

key(

欄位名)

--欄位名同上 --

唯一約束:

alter

table表名

addconstraint uq_

欄位名

unique

(欄位名)

--外來鍵約束:

alter

table表名

addconstraint 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

ondelete

cascade

級聯更新,級聯刪除,這樣在刪除主表

student

時,成績表中該學生的所有成績都會刪除。 --

檢查約束:

alter

table表名

addconstraint ck_

欄位名

check

(條件表示式)--

條件表示式中的條件用關係運算子連線 --

預設值約束:

alter

table表名

addconstraint 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

andsyscolumns.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'

SQL 主鍵和外來鍵約束

sql 的主鍵和外來鍵的作用 外來鍵取值規則 空值或參照的主鍵值。1 插入非空值時,如果主鍵表中沒有這個值,則不能插入。2 更新時,不能改為主鍵表中沒有的值。3 刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。4 更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。簡而言之,s...

SQL的主鍵和外來鍵約束

sql 的主鍵和外來鍵的作用 外來鍵取值規則 空值或參照的主鍵值。1 插入非空值時,如果主鍵表中沒有這個值,則不能插入。2 更新時,不能改為主鍵表中沒有的值。3 刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。4 更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。簡而言之,s...

mysql的主鍵 外來鍵約束 MySQL 主鍵外來鍵

笛卡兒積 多表查詢 多個表變成乙個表 完整性約束條件 primary key 標識該屬性為該錶的主鍵,可以唯一的標識對應的元組 foreign key 標識該屬性為該錶的外來鍵,是與之聯絡的某錶的主鍵 not null 標識該屬性不能為空 unique 標識該屬性的值是唯一的 auto increm...