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