資料庫六大約束用法:主鍵(primary key)、外來鍵(foreign key)、非空(not null)、預設(default)、檢查(check)、唯一(unique)
阿新 • • 發佈:2019-02-05
1. 資料庫有六大約束
- 主鍵(primary key)
- 外來鍵(foreign key):被參照的鍵必須有唯一約束或是主鍵
- 非空(not null)
- 預設(default)
- 檢查(check):oracle獨有
- 唯一(unique)
2. 六大約束的用法
以下所有演示的SQL語句都是基於Oracle,可能在MySQL中使用有些出入。不過不用擔心,後面會指出一些MySQL與Oracle的不同之處
-- 1.建立部門表dept 用於演示外來鍵
create table test_dept(
deptno varchar2(20) primary key,
dname varchar2(20 ),
loc varchar2(20)unique
);
-- 2.建立員工表emp
create table test_emp(
-- 1.員工id:新增主鍵約束primary key
eid varchar(20) primary key,
-- 2.員工名字:新增非空約束not null,唯一約束unique
ename varchar(20) not null unique,
-- 3.員工性別與年齡:新增檢查約束check
sex char(2) check(sex in ('男','女')),
age number(3 ) check(age>0),
-- 4.員工工資:新增預設約束default
sal number(7,2) default('3000'),
-- 5.員工所屬部門:新增外來鍵約束forein key
deptno references test_dept(deptno),
-- 6.部門地址:用於單獨新增外來鍵約束演示
loc varchar2(20)
);
-- 單獨新增或修改check約束
alter table test_emp add constraint age check (age>0 and age<140);
--- 單獨新增外來鍵約束
alter table test_emp add constraint fk_loc foreign key(loc) references test_dept(loc);
-- 也可以將check約束和主鍵約束放在最後
create table test_emp2(
-- 1.員工id:主鍵約束primary key
eid varchar(20),
-- 2.員工名字:非空約束not null,唯一約束unique
ename varchar(20) not null unique,
-- 3.員工性別與年齡:檢查約束check
sex char(2),
age number(3),
-- 4.員工工資:預設約束default
sal number(7,2) default('3000'),
-- 5.員工所屬部門:外來鍵約束forein key
deptno references test_dept(deptno),
-- 6.部門地址:用於單獨新增外來鍵約束演示
loc varchar(20),
primary key(eid),check(sex in ('男','女')),check(age>0)
);
-- default約束用法:
-- 1.預設為空:default null
-- 2.預設值型別為字串:default '普通使用者' 或default('普通使用者')
-- 3.預設值型別為數值:default 2000 或default(2000)
-- 推薦使用不需要括號方式:default 'admin' 或 default 2000
-- oracle中:default約束必須放在非空約束(not null)前面
create table test_emp3(
-- 1.員工id:主鍵約束primary key
eid varchar(20),
-- 2.員工名字:非空約束not null,唯一約束unique
ename varchar(20),
-- 3.員工性別與年齡:檢查約束check
sex char(2),
age number(3),
-- 4.員工工資:預設約束default
sal number(7,2) default(533) not null ,
-- 5.員工所屬部門:外來鍵約束foreign key
deptno references test_dept(deptno),
-- 6.部門地址:用於單獨新增外來鍵約束演示
loc varchar2(20),
check(sex in ('男','女')),check(age>0)
);
-- 單獨新增主鍵
alter table test_emp3 add constraint pk_ename primary key(ename);
-- 一次新增多個主鍵
-- 注意:1.一次新增多個主鍵,只能採取下列方式(使用GUI工具除外);
-- 2.不能使用分別在eid和ename後面加primary key
-- 3.也不能先給eid設定為primary key ,在表建立完畢後在使用alter去給ename新增主鍵
create table test_emp4(
-- 1.員工id:主鍵約束primary key
eid varchar(20),
-- 2.員工名字:非空約束not null,唯一約束unique
ename varchar(20),
-- 3.員工性別與年齡:檢查約束check
sex char(2),
age number(3),
-- 4.員工工資:預設約束default
sal number(7,2) default(533) not null ,
-- 5.員工所屬部門:外來鍵約束forein key
deptno references test_dept(deptno),
-- 6.部門地址:用於單獨新增外來鍵約束演示
loc varchar2(20),
primary key(eid,ename),check(sex in ('男','女')),check(age>0)
);
3. mysql中如何實現類似於oracle的檢查約束
可以採用列舉enum來實現類似檢查約束的功能。
CREATE TABLE `testuser` (
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(12) NOT NULL DEFAULT '',
`real_name` VARCHAR(12) NOT NULL DEFAULT '',
`password` VARCHAR(8) NOT NULL DEFAULT '',
`sex` ENUM('0','1') NOT NULL DEFAULT '0',
`degree` ENUM('1','2','3','4') NOT NULL DEFAULT '1',
`birthday` DATETIME DEFAULT NULL,
PRIMARY KEY (`user_id`)
);
4.mysql建立外來鍵
(1)建立表時新增外來鍵
新增一個外來鍵
create table users(
username varchar(50),
role_id int ,
constraint fk_users_roles foreign key (role_id) references roles(roleid)
);
可以新增兩個主鍵
CREATE TABLE roles_menus (
roles_id INT ,
menus_id INT,
PRIMARY KEY (roles_id, menus_id),
CONSTRAINT fk_users_roles FOREIGN KEY (roles_id) REFERENCES roles(roleid),
CONSTRAINT fk_users_menus FOREIGN KEY (menus_id) REFERENCES menus(menuid)
);
(2)建立表後,單獨新增外來鍵約束
create table users(
username varchar (50) primary key,
role_id int
);
alter table users add constraint fk_users_roles foreign key (role_id) references roles(roleid);