1. 程式人生 > >資料庫六大約束用法:主鍵(primary key)、外來鍵(foreign key)、非空(not null)、預設(default)、檢查(check)、唯一(unique)

資料庫六大約束用法:主鍵(primary key)、外來鍵(foreign key)、非空(not null)、預設(default)、檢查(check)、唯一(unique)

1. 資料庫有六大約束

  1. 主鍵(primary key)
  2. 外來鍵(foreign key):被參照的鍵必須有唯一約束或是主鍵
  3. 非空(not null)
  4. 預設(default)
  5. 檢查(check):oracle獨有
  6. 唯一(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);