南寧做網(wǎng)站設(shè)計(jì)方案微商軟文范例
1、查看約束
?SHOW CREATE TABLE table_name
2、主鍵約束(PRIMARY KEY)
主鍵約束最顯著的特征是主鍵列中的值是不允許重復(fù)(唯一)的,通過主鍵約束可強(qiáng)制表 的實(shí)體完整性。當(dāng)創(chuàng)建或更改表時(shí)可通過定義 primary key 約束來創(chuàng)建主鍵。一個(gè)表只 能有一個(gè)primary key約束,且primary key約束中的列不能接受NULL值。
alter table tab_name add constraint pk_name primary key (deptno);
在創(chuàng)建表時(shí)有以下幾種方式:(三種)?
?-- 創(chuàng)建表時(shí)CREATE TABLE `table_name` (`id` int PRIMARY KEY, -- 設(shè)置主鍵`name` varchar(20));CREATE TABLE `table_name` (`id` int NOT NULL,`name` varchar(20) ,PRIMARY KEY (`id`) -- 設(shè)置主鍵);CREATE TABLE `table_name` (`id` int NOT NULL,`name` varchar(20) ,constraint pk primary key(id) -- 設(shè)置主鍵);
----設(shè)置主鍵的其它方式(用于修改字段的主鍵)
?-- 設(shè)置主鍵是deptnoALTER TABLE emp MODIFY empno INT PRIMARY KEY; -- 修改列的屬性來添加主鍵約束ALTER TABLE 表名稱 ADD PRIMARY KEY(id);ALTER TABLE dept ADD CONSTRAINT pk_name PRIMARY KEY(deptno);
?----刪除主鍵
?ALTER TABLE 表名稱 DROP PRIMARY KEY; -- 【推薦】
3、自增長列(AUTO_INCRUEMENT)
并不是所有表在設(shè)計(jì)完成后都能找到適合作為主鍵的列,為此數(shù)據(jù)庫提供了自增長列,自 增長列是數(shù)值類型( INT , FLOAT , DOUBLE 等)的,其值是由數(shù)據(jù)庫自動(dòng)維護(hù)的,是永遠(yuǎn)都不 會(huì)重復(fù)的,因此自增長是最適合作為主鍵列的。在創(chuàng)建表時(shí),通過 auto_increment 關(guān)鍵 字來標(biāo)識(shí)自增長列,在MySQL數(shù)據(jù)庫中自增長列可以是主鍵列,也可以是唯一列(有唯一 約束的列)。
特點(diǎn):
1. 標(biāo)識(shí)列必須和一個(gè)Key搭配(Key指主鍵、唯一、外鍵....)
2. 一個(gè)表最多有一個(gè)標(biāo)識(shí)列
3. 標(biāo)識(shí)列的類型只能是數(shù)值型
4. 標(biāo)識(shí)列可以通過 SET auto_increment_increment = 3;?或者??????????????????????????????????????????????????????SET @@auto_increment_increme nt = 3; 設(shè)置步長(全局),可以通過插入行時(shí)手動(dòng)插入標(biāo)識(shí)列值設(shè)置起始值。(思 考:什么情況下此設(shè)置會(huì)失效)
如果設(shè)置步長會(huì)從 1 + 步長 依次遞增。
如果表中已有數(shù)據(jù),會(huì)按照 1 + 步長進(jìn)行計(jì)算,如果這個(gè) 值 已有則再加直到?jīng)]有
自增長與主鍵?
CREATE TABLE emp(empNo INT PRIMARY KEY AUTO_INCREMENT,job VARCHAR(10),mgr INT,sal DOUBLE,comm DOUBLE,deptno INT
)CHARACTER SET utf8;-- 設(shè)置自增長列的初始值
CREATE TABLE temp(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(2)
) AUTO_INCREMENT=10;-- 設(shè)置自增長列的初始值
ALTER TABLE emp AUTO_INCREMENT = 10;
alter table 表名稱 modify column id int auto_increment;-- 刪除自增長列
ALTER TABLE 表名稱 MODIFY COLUMN id INT;
4、唯一約束
對(duì)于非主鍵列中的值也要求唯一性的時(shí)候,就需要唯一約束。
CREATE TABLE `table_name` (`id` int NOT NULL,`name` VARCHAR(20) UNIQUE?? ??? ?-- 唯一約束
);CREATE TABLE `table_name`(`id` int NOT NULL,`name` VARCHAR(20),constraint uq_name UNIQUE(name)?? ?-- 唯一約束
);alter table 表名稱 ADD unique(列名稱);
alter table dept ADD constraint uq_name UNIQUE(deptname);# 刪除唯一約束
alter table tb_name drop constraint constraint_name;
alter table 表名稱 drop index 唯一約束名;?? ?-- 刪除索引
- 唯一約束要求值不能重復(fù)
- 一張表可以有多個(gè)唯一約束列
- 約束默認(rèn)的名稱為其列名
- 唯一約束創(chuàng)建后會(huì)自動(dòng)創(chuàng)建一個(gè)唯一索引
5、 默認(rèn)約束default
為列中的值設(shè)置默認(rèn)值,default ....,如果已經(jīng)定了值,默認(rèn)值就無效了
-- 創(chuàng)建表時(shí)
CREATE TABLE `table_name` (`id` int DEFAULT NULL, # 默認(rèn)約束`name` varchar(20) unique,
);-- 添加默認(rèn)約束第一種
alter table 表名稱 modify column 列名 列類型 default 默認(rèn)值;
-- 添加默認(rèn)約束第二種
alter table 表名 change column old_col_name new_col_name new_type default value;-- 刪除
alter table 表名稱 modify column 列名 列類型; -- 將默認(rèn)值改為 NULL
ALTER TABLE tb_name ALTER col_name DROP DEFAULT; -- 刪除了默認(rèn)值,新增時(shí)必須有值
- 創(chuàng)建表時(shí),不寫默認(rèn)值都默認(rèn) NULL (在無非空約束的情況下)
- 默認(rèn)約束能和主鍵約束可以同時(shí)存在
- 默認(rèn)約束不能和 AUTO_INCREMENT 同時(shí)使用
6. 非空約束
NOT NULL :非空,用于保證該字段的值不能為空。例如學(xué)生表的學(xué)生姓名及學(xué)號(hào)等等?
-- 創(chuàng)建表時(shí)
CREATE TABLE `table_name` (`id` int NOT NULL, # 非空約束`name` varchar(20),
);alter table 表名稱 modify column 列名 列類型 not null;-- 刪除
alter table 表名稱 modify column 列名 列類型 [null];
7. 外鍵約束
A表中列的值來自于另外一張表B的主鍵或唯一鍵的列稱為 外鍵FK,將被引用值得表稱為
主表或父表,將引用值得表稱為從表或子表。 例如: emp 表中有 deptno 列,值來自于 de
pt 表的 主鍵 deptno 。 dept 是主表, emp 是從表。
?
-- 創(chuàng)建表時(shí)
CREATE TABLE `dept`(dept_no INT PRIMARY KEY,dept_name VARCHAR(20),
)CREATE TABLE `emp` (`id` int NOT NULL,`name` varchar(20),`deptno` int,CONSTRAINT fk_dept_no FOREIGN KEY(deptno) REFERENCES dept(dept_no)
);alter table userinfo add constraint foreign key fk_dept_no (dept_no) REFERENCES dept(deptno);-- 刪除
ALTER TABLE tb_name DROP CONSTRAINT constraint_name;
alter table 表名稱 drop foreign key 設(shè)置外鍵時(shí)的名稱;?
?在外鍵約束中,主表(父表)是指有外鍵的表,子表(從表)是指沒有外鍵的表。 一般來說,外鍵是本表中的字段,本表是子表,通常外鍵引用父表的主鍵。但是當(dāng)外鍵引用的是父表不為主鍵的字段時(shí),此時(shí)外鍵所約束的列可以有一個(gè)或多個(gè)null同時(shí)出現(xiàn)。因?yàn)閚ull不是值,不存在重復(fù)。
- 創(chuàng)建外鍵時(shí),會(huì)在引用表(從表)的字段上建立索引
- 這個(gè)字段上有則不創(chuàng)建
- 在 userinfo 表中添加或修改時(shí), dept_no 列的值必須是 dept 表中 deptno 字段中的存在值或者 NULL
- 刪除主表數(shù)據(jù)時(shí),會(huì)先檢查被刪除數(shù)據(jù)在從表中有沒有對(duì)此數(shù)據(jù)的關(guān)聯(lián)(引用),如果有不能直接刪除。
如果想要解除此限制需要先禁用外鍵約束【不推薦】
我們可以在創(chuàng)建約束時(shí),設(shè)置級(jí)聯(lián)操作【具體如何操作?】
- - `on delete CASCADE`/ `on update CASCADE` 級(jí)聯(lián)刪除 / 級(jí)聯(lián)更新
- - `ON DELETE SET NULL` / `ON UPDATE SET NULL`
8、檢查約束?
check 檢查約束,在數(shù)據(jù)添加或修改時(shí)保證數(shù)據(jù)的有效性。符合表達(dá)式的才會(huì)正確執(zhí)行。
-- 創(chuàng)建檢查約束的集中方法:
CREATE TABLE users (... ,age INT CHECK (age >= 18)
);CREATE TABLE users (... ,CONSTRAINT chk_xxx CHECK(expr)
);ALTER TABLE emp2 MODIFY sal DOUBLE CHECK(sal >= 2000);
ALTER TABLE tb_name ADD CONSTRAINT chk_xx check(id > 10);-- 刪除約束
ALTER TABLE tb_name DROP CONSTRAINT tb_chk_num;
- 在MySQL 8.0.16之前的版本中沒有 CHECK 約束。