SQL語句中主鍵和外來鍵

2021-09-21 06:27:00 字數 4688 閱讀 5190

create

table user_info(

id char(36

)primary

key,

user_name varchar(30

)not

null

, password varchar(30

)not

null

, real_name varchar(8

),mobile char(11

),address varchar

(150))

;

執行結果:建立乙個user_info表,主鍵為id,主鍵不能重複,不能為空。

insert

into user_info (id,user_name,password,real_name,mobile,address)

values

(null

,'fuliuqingfeng'

,'123456'

,'張三'

,'18920120206'

,'河南安陽'

);

insert

into user_info (id,user_name,password,real_name,mobile,address)

values

('12'

,'fuliuqingfeng'

,'123456'

,'張三'

,'18920120206'

,'河南安陽');

insert

into user_info (id,user_name,password,real_name,mobile,address)

values

('12'

,'fuliuqingfeng'

,'123456'

,'張三'

,'18920120206'

,'河南安陽'

);

上面兩次插入均不成功!

對上述user_info表進行插入:

insert

into user_info (id,user_name,password,real_name,mobile,address)

values

('1'

,'fuliuqingfeng'

,'123456'

,'張三'

,'18920120206'

,'河南安陽');

insert

into user_info (id,user_name,password,real_name,mobile,address)

values

('2'

,'fuliuqingfeng'

,'123456'

,'張三'

,'18920120206'

,'河南安陽');

insert

into user_info (id,user_name,password,real_name,mobile,address)

values

('3'

,'fuliuqingfeng'

,'123456'

,'張三'

,'18920120206'

,'河南安陽'

);

執行結果:

可見表中user_name和password有大量冗餘資訊,如果個人資訊字段比較多這一問題表現的越嚴重。

也可以將乙個表分為兩個表來操作:

create

table user_info(

id char(36

)primary

key,

user_name varchar(30

)not

null

, password varchar(30

)not

null

)insert

into user_info (id,user_name,password)

values

('1'

,'fuliuqingfeng'

,'123456');

create

table address(

id char(36

)primary

key,

user_info_id char(36

),real_name varchar(8

)not

null

, mobile char(11

)not

null

, address varchar

(150

)not

null

)insert

into address (id,user_info_id,real_name,mobile,address)

values

('1'

,'1'

,'張三'

,'18920120206'

,'河南安陽');

insert

into address (id,user_info_id,real_name,mobile,address)

values

('2'

,'1'

,'李四'

,'18617297545'

,'北京海淀');

insert

into address (id,user_info_id,real_name,mobile,address)

values

('3'

,'1'

,'王五'

,'17694976949'

,'山西大同'

);

執行結果:

user_info表

address表

消除了大量冗餘,但是如果在user_info中刪除id為1的資訊,那麼在address表中就找不到user_info_id為1的資訊屬於哪個使用者,並且,在address表中查入一條user_info_id不存在的資訊時,該資料不完整,找不到該條位址資訊屬於哪個使用者。

為解決上述問題我們使用外來鍵約束。

create

table user_info(

id char(36

)primary

key,

user_name varchar(30

)not

null

, password varchar(30

)not

null

)insert

into user_info (id,user_name,password)

values

('1'

,'fuliuqingfeng'

,'123456');

create

table address(

id char(36

)primary

key,

user_info_id char(36

),real_name varchar(8

)not

null

, mobile char(11

)not

null

, address varchar

(150

)not

null

,constraint address_user_info_id_fk foreign

key(user_info_id)

references user_info(id)

)insert

into address (id,user_info_id,real_name,mobile,address)

values

('1'

,'1'

,'張三'

,'18920120206'

,'河南安陽');

insert

into address (id,user_info_id,real_name,mobile,address)

values

('2'

,'1'

,'李四'

,'18617297545'

,'北京海淀');

insert

into address (id,user_info_id,real_name,mobile,address)

values

('3'

,'1'

,'王五'

,'17694976949'

,'山西大同'

);

其中foreign key約束用於預防破壞表之間連線的動作,即在address中有user_info_id為1的資訊時,不允許刪除user_name中id為1的資訊,foreign key 約束也能防止非法資料插入外來鍵列,因為它必須是它指向的那個表中的值之一。也就是說,不允許在address中插入user_info_id的值在user_name不存在的位址資訊。

sql 語句,主鍵外來鍵詳解

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

sql 語句,主鍵外來鍵詳解

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

SQL 主鍵和外來鍵約束

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