这里先罗列一下两者的区别和作用
主键:为了标识数据的唯一性 不能为空
外键:为了保证数据的准确跟一致性 可以为空
===========================================
SQL PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
======================================
外键:
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不存在的地址信息。