MySQL數(shù)據(jù)庫表約束超詳細(xì)講解
前言
在MySQL里,“約束”指的是對表中數(shù)據(jù)的一種限制約束,它能夠確保數(shù)據(jù)庫中數(shù)據(jù)的準(zhǔn)確性和有效性
比如有的數(shù)據(jù)是必填項,就像身份認(rèn)證的時候,或者填注冊信息的時候,手機(jī)號身份證這種就不能空著,所以就有了非空約束;又有的數(shù)據(jù)比如用戶的唯一id,不能跟其他人的一樣,所以就需要使用唯一約束等等。
在MySQL中主要有6種約束:主鍵約束、外鍵約束、唯一約束、檢查約束、非空約束和默認(rèn)值約束。
一. 主鍵約束——PRIMARY KEY
“主鍵約束“是6種約束中使用最多的約束。
在建立數(shù)據(jù)表的時候,一般情況下,為了方便更快地查找表中的記錄,都會要求在表中設(shè)置一個“主鍵”。”主鍵“是表里面的一個特殊字段,這個字段能夠唯一標(biāo)識該表中的每條信息。
主鍵分為“單字段主鍵”和“多字段聯(lián)合主鍵”,并且在使用主鍵的時候需要注意以下幾個點(diǎn):
- 一個表只能定義一個主鍵;
- 主鍵值必須唯一標(biāo)識表中的每一行,并且不能出現(xiàn)
null
的情況,即表中不能存在有相同主鍵的兩行或兩行以上數(shù)據(jù),嚴(yán)格遵守唯一性原則; - 一個字段名只能在聯(lián)合主鍵字段表中出現(xiàn)一次;
- 聯(lián)合主鍵不能包含不必要的多余字段,以滿足最小化原則。
1.在建表時設(shè)置主鍵約束
設(shè)置單字段主鍵
1)在定義字段的時候設(shè)置主鍵約束,語法格式:
<字段名> <數(shù)據(jù)類型> PRIMARY KEY [默認(rèn)值]
例:在數(shù)據(jù)庫中創(chuàng)建學(xué)生信息數(shù)據(jù)表st_info,主鍵為st_id, SQL語句以及運(yùn)行結(jié)果如下:
create table st_info( st_id int(10) primary key, name varchar(20), class varchar(10), gender varchar(4), age int(2) ); mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
2)在定義完所有字段之后指定部件,語法格式:
[CONSTRAINT <約束名>] PRIMARY KEY [字段名]
例 在數(shù)據(jù)庫中創(chuàng)建學(xué)生信息數(shù)據(jù)表st_info2
,主鍵為st_id
, SQL語句以及運(yùn)行結(jié)果如下:
create table st_info2( st_id int(10), name varchar(20), class varchar(10), gender varchar(4), age int(2), primary key(st_id) ); mysql> desc st_info2; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
設(shè)置聯(lián)合主鍵
聯(lián)合主鍵即一張表的主鍵由多個字段組成。
比如在學(xué)生信息表中,可以設(shè)置st_id跟name來作為聯(lián)合主鍵,語法格式以及SQL語句實(shí)現(xiàn)為:
PRIMARY KEY [字段1,字段2,…,字段n] create table st_info3( st_id int(10), name varchar(20), class varchar(10), gender varchar(4), age int(2), primary key(st_id,name) ); mysql> desc st_info3; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | PRI | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
需要注意的是,在設(shè)置聯(lián)合主鍵的時候,不能在每個字段名后面直接聲明主鍵約束。
2. 在修改表的時候添加主鍵約束
如果在創(chuàng)建表的時候沒有設(shè)置主鍵約束,還可以在修改表時進(jìn)行添加,但是設(shè)置成主鍵約束的字段不允許有空值。語法格式:
ALTER TABLE <數(shù)據(jù)表名> ADD PRIMARY KEY(<字段名>); mysql> desc st_info4; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+
將st_id
與name
設(shè)置成主鍵:
mysql> alter table st_info4 add primary key(st_id,name); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc st_info4; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | PRI | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
3. 刪除主鍵約束
當(dāng)一個表中不需要主鍵約束時,就需要從表中將其刪除。
例 刪除st_info4
數(shù)據(jù)表中的主鍵約束:
mysql> alter table st_info4 drop primary key; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc st_info4; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
4. 【補(bǔ)充】 MySQL設(shè)置主鍵自增長 :
在MySQL里,當(dāng)主鍵定義為自增長后,主鍵的值就不需要自己再輸入數(shù)據(jù)了,而是由數(shù)據(jù)庫系統(tǒng)根據(jù)定義自動賦值,每增加一條記錄,主鍵就會自動根據(jù)設(shè)置的步長進(jìn)行增長。
在MySQL中自增長的關(guān)鍵字是AUTO_INCREMENT
,語法格式為:
字段名 數(shù)據(jù)類型 AUTO_INCREMENT
例 創(chuàng)建學(xué)生信息表st_info5
,指定st_id
字段自增,
create table st_info5( st_id int(10) primary key auto_increment, name varchar(20) not null, class varchar(10), gender varchar(4), age int(2) );
此時可以不用再手動插入st_id
的數(shù)據(jù):
insert into st_info5(name,class,gender,age) values('王思瑤','管理學(xué)1班','女',18), ('王綺夢','管理學(xué)1班','女',18), ('李若彤','管理學(xué)1班','男',18); mysql> select * from st_info5; +-------+--------+-----------+--------+------+ | st_id | name | class | gender | age | +-------+--------+-----------+--------+------+ | 1 | 王思瑤 | 管理學(xué)1班 | 女 | 18 | | 2 | 王綺夢 | 管理學(xué)1班 | 女 | 18 | | 3 | 李若彤 | 管理學(xué)1班 | 男 | 18 | +-------+--------+-----------+--------+------+ 3 rows in set (0.01 sec)
但是在設(shè)置學(xué)號的時候不一定是從1開始的,比如要從2000150001開始,則需要在建表之后設(shè)置自增的起始數(shù)據(jù):
create table st_info6( st_id int(10) primary key auto_increment, name varchar(20) not null, class varchar(10), gender varchar(4), age int(2) )auto_increment=2000150001; insert into st_info6(name,class,gender,age) values('王思瑤','管理學(xué)1班','女',18), ('王綺夢','管理學(xué)1班','女',18), ('李若彤','管理學(xué)1班','男',18); mysql> select * from st_info6; +------------+--------+-----------+--------+------+ | st_id | name | class | gender | age | +------------+--------+-----------+--------+------+ | 2000150001 | 王思瑤 | 管理學(xué)1班 | 女 | 18 | | 2000150002 | 王綺夢 | 管理學(xué)1班 | 女 | 18 | | 2000150003 | 李若彤 | 管理學(xué)1班 | 男 | 18 | +------------+--------+-----------+--------+------+ 3 rows in set (0.00 sec)
值得注意的地方是,如果在插入某一行數(shù)據(jù)產(chǎn)生了報錯,則最終自增字段可能會出現(xiàn)不連續(xù)的情況。
二. 外鍵約束——FOREIGN KEY
外鍵約束是表的一個特殊字段,普遍會和主鍵約束一起使用,用來確保數(shù)據(jù)的一致性。
對于兩個具有關(guān)聯(lián)關(guān)系的表來說,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。
所以外鍵就是用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個表的數(shù)據(jù)建立連接,約束兩個表中數(shù)據(jù)的一致性和完整性。
在定義外鍵時需要遵守以下規(guī)則:
- 主表必須已經(jīng)存在于數(shù)據(jù)庫中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個表,這樣的表稱做自參照表,這種結(jié)構(gòu)稱做自參照完整性;
- 必須為主表定義主鍵;
- 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值;
- 在主表的表名后面指定列名或列名的組合,這個列或列的組合必須是主表的主鍵或候選鍵;
- 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同;
- 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對應(yīng)列的數(shù)據(jù)類型相同。
1.在創(chuàng)建表時設(shè)置外鍵約束
在建表語句中,可以加入關(guān)鍵字FOREIGN KEY
來指定外鍵,用REFERENCES
來連接與主表的關(guān)系語法格式:
CONSTRAINT <約束名> FOREIGN KEY <外鍵名>(字段名1,字段名2...) REFERENCES <主表名>(主鍵字段名)
例:
① 使用1部分創(chuàng)建的st_info5
數(shù)據(jù)表作為主表:
mysql> desc st_info5; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | st_id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+
② 創(chuàng)建tb_1
數(shù)據(jù)表,并在表上創(chuàng)建外鍵約束,使其中course_id
作為外鍵關(guān)聯(lián)到表st_info5
的主鍵st_id
:
create table tb_1( course_id int(8) not null auto_increment, course_name varchar(25) not null, constraint course_Choosing foreign key fk_course(course_id) references st_info5(st_id) )auto_increment=20015001; mysql> desc tb_1; +-------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+----------------+ | course_id | int | NO | MUL | NULL | auto_increment | | course_name | varchar(25) | NO | | NULL | | +-------------+-------------+------+-----+---------+----------------+
上面語句執(zhí)行成功之后,在表tb_1
中添加了course_Choosing
的約束名稱,以及外鍵名稱為fk_course
的course_id
字段,依賴于表st_info5
的主鍵st_id
。
2. 在修改表時添加外鍵約束
同樣的可以在創(chuàng)建表之后再修改,SQL語句如下:
alter table tb_1 add constraint course_Choosing foreign key fk_course(course_id) references st_info5(st_id);
這里需要注意的是,從表的外鍵關(guān)聯(lián)的必須是主表的主鍵,且主鍵和外鍵的數(shù)據(jù)類型必須一致。例如兩者都是int型或者都是char型數(shù)據(jù)。
3. 刪除外鍵約束
當(dāng)一個表中不需要外鍵約束時,就需要從表中將其刪除。外鍵一旦刪除,就會解除主表和從表間的關(guān)聯(lián)關(guān)系。
刪除的語法格式:
ALTER TABLE <表名> DROP FOREIGN KEY <外鍵約束名>;
例:
alter table tb_1 drop foreign key fk_course;
三. 唯一約束——UNIQUE KEY
唯一約束就是指所有記錄中字段的值不能重復(fù)出現(xiàn),比如給'id'字段加上唯一約束之后,每條記錄的id值都是唯一的,不能出現(xiàn)重復(fù)的情況。
唯一約束與主鍵約束有一個相似的地方,就是它們都能夠確保列的唯一性。與主鍵約束不同的是,唯一約束在一個表中可以有多個,并且設(shè)置唯一約束的列是允許有空值的,雖然只能有一個空值。
例如,在用戶信息表中,要避免表中的用戶名重名,就可以把用戶名列設(shè)置為唯一約束。
1.在創(chuàng)建表時設(shè)置唯一約束
唯一約束可以在創(chuàng)建表的時候直接進(jìn)行設(shè)置,通常設(shè)置在除了主鍵以外的其他列上,語法格式如下:
<字段名> <數(shù)據(jù)類型> UNIQUE
例 創(chuàng)建圖書館所有書本明細(xì)表book_info ,設(shè)定書本bk_id為主鍵,書本ISBN為唯一鍵,SQL語句如下:
create table book_info( bk_id int primary key, ISBN varchar(17) unique, author varchar(50), Publisher varchar(20) ); mysql> desc book_info; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | bk_id | int | NO | PRI | NULL | | | ISBN | varchar(17) | YES | UNI | NULL | | | author | varchar(50) | YES | | NULL | | | Publisher | varchar(20) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
2. 在修改表時添加唯一約束
語法格式:
ALTER TABLE <數(shù)據(jù)表名> ADD CONSTRAINT <唯一約束名> UNIQUE(<列名>);
例 將book_info表中author字段設(shè)置為唯一約束:
alter table book_info add constraint uni_author unique(author); mysql> desc book_info; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | bk_id | int | NO | PRI | NULL | | | ISBN | varchar(17) | YES | UNI | NULL | | | author | varchar(50) | YES | UNI | NULL | | | Publisher | varchar(20) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)
3. 刪除唯一約束
語法格式:
ALTER TABLE <表名> DROP INDEX <唯一約束名>;
例 刪除book_info表中的唯一約束uni_author;
alter table book_info drop index uni_author; mysql> desc book_info; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | bk_id | int | NO | PRI | NULL | | | ISBN | varchar(17) | YES | UNI | NULL | | | author | varchar(50) | YES | | NULL | | | Publisher | varchar(20) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
四. 檢查約束——CHECK
檢查約束是用來檢查數(shù)據(jù)表中字段值有效性的一種約束。
例如,學(xué)生信息表中的年齡字段是不能有負(fù)數(shù)的,并且數(shù)值范圍也是有限制的。如果是大學(xué)生,正常年齡一般應(yīng)該在 18~30 歲之間。在設(shè)置字段的檢查約束時需要根據(jù)實(shí)際情況進(jìn)行設(shè)置,這樣能夠減少無效數(shù)據(jù)的輸入。
1.在創(chuàng)建表時設(shè)置檢查約束
語法格式:
CHECK(<約束條件>)
例 在persons表創(chuàng)建時id_p列創(chuàng)建check約束,約束條件為id_p列數(shù)據(jù)必須只包含大于0的整數(shù):
create table persons( id_p int not null, lastname varchar(255) not null, firstname varchar(255), address varchar(255), city varchar(255), check (id_p>0) ); mysql> desc persons; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | id_p | int | NO | | NULL | | | lastname | varchar(255) | NO | | NULL | | | firstname | varchar(255) | YES | | NULL | | | address | varchar(255) | YES | | NULL | | | city | varchar(255) | YES | | NULL | | +-----------+--------------+------+-----+---------+-------+
2. 在修改表時添加檢查約束
語法格式:
ALTER TABLE <表名> ADD CONSTRAINT <檢查約束名> CHECK(<檢查約束>)
例 修改persons數(shù)據(jù)表,要求city字段為“上海”:
create table persons( id_p int not null, lastname varchar(255) not null, firstname varchar(255), address varchar(255), city varchar(255), constraint chk_person check (id_p>0 and city='sandnes') ); alter table persons add constraint chk_ct check(city='上海'); mysql> desc persons; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | id_p | int | NO | | NULL | | | lastname | varchar(255) | NO | | NULL | | | firstname | varchar(255) | YES | | NULL | | | address | varchar(255) | YES | | NULL | | | city | varchar(255) | YES | | NULL | | +-----------+--------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
3. 刪除檢查約束
語法格式:
ALTER TABLE <表名> DROP CONSTRAINT <檢查約束名>;
例 刪除persons表中的check_ct約束:
alter table persons drop constraint chk_ct;
五. 非空約束——NOT NULL
非空約束是用來約束表中的字段不能為空。在表中某個列的定義后加上關(guān)鍵字NOT NULL作為限定詞,來約束該列的取值不能為空。
例如,在學(xué)生信息表中,如果不添加學(xué)生姓名,那么這條記錄是無效的,這種情況下就可以為用戶名字段設(shè)置非空約束。
1.在創(chuàng)建表時設(shè)置非空約束
語法格式:
CREATE TABLE <表名>( ... <字段名> <數(shù)據(jù)類型> NOT NULL) ... );
例 創(chuàng)建學(xué)生信息表st_info, 指定st_id為主鍵,學(xué)生姓名不能為空:
create table st_info( st_id int(10) primary key, name varchar(20) not null, class varchar(10), gender varchar(4), age int(2) ); mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
2. 在修改表時添加非空約束:
如果在創(chuàng)建表的時候忘記了為字段設(shè)置非空約束,可以通過修改表進(jìn)行非空約束的添加。
語法格式:
ALTER TABLE <表名> CHANGE COLUMN <字段名> <字段名> <數(shù)據(jù)類型> NOT NULL;
例 修改學(xué)生信息表st_info中class字段,設(shè)置成非空約束:
mysql> alter table st_info -> change column class -> class varchar(20) not null; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(20) | NO | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
3. 刪除非空約束
可以在修改語句中對非空約束進(jìn)行刪除。
語法格式:
ALTER TABLE <數(shù)據(jù)表名> CHANGE COLUMN <字段名> <字段名> <數(shù)據(jù)類型> NULL;
例 修改學(xué)生信息表st_info,將class字段的非空約束刪除:
mysql> alter table st_info -> change column class -> class varchar(20) null; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(20) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
六. 默認(rèn)值約束——DEFAULT
默認(rèn)值約束是當(dāng)數(shù)據(jù)表中某個字段不輸入值的時候,自動為其添加一個已經(jīng)設(shè)置好的值。
例如,在注冊學(xué)生信息時,如果不輸入學(xué)生的性別,那么會默認(rèn)設(shè)置一個性別或者輸入一個“未知”。
默認(rèn)值約束一般是用在已經(jīng)設(shè)置了非空約束的列,這樣能夠防止數(shù)據(jù)表在錄入數(shù)據(jù)時出現(xiàn)錯誤。
1.在創(chuàng)建表時設(shè)置默認(rèn)值約束
語法格式:
CREATE TABLE <表名>( ... <字段名> <數(shù)據(jù)類型> DEFAULT <默認(rèn)值> ... );
例 創(chuàng)建學(xué)生信息表st_info,設(shè)置年齡age默認(rèn)值為18:
create table st_info( st_id int(10) primary key, name varchar(20) not null, class varchar(10), gender varchar(4), age int(2) default 18 ); mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | 18 | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.01 sec)
2. 在修改表時添加默認(rèn)值約束
語法格式:
ALTER TABLE <數(shù)據(jù)表名> CHANGE COLUMN <字段名> <字段名> <數(shù)據(jù)類型> DEFAULT <默認(rèn)值>;
例 修改學(xué)生信息表st_info,將性別設(shè)置默認(rèn)值為“保密”:
mysql> alter table st_info -> change column gender -> gender varchar(4) default '保密'; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | 保密 | | | age | int | YES | | 18 | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
需要注意的是,這里的gender字段為字符串型數(shù)據(jù),需要加上引號。
3. 刪除默認(rèn)值
刪除默認(rèn)值即為將默認(rèn)值設(shè)置為空(null)
語法格式:
ALTER TABLE <數(shù)據(jù)表名> CHANGE COLUMN <字段名> <字段名> <數(shù)據(jù)類型> DEFAULT NULL;
例 修改學(xué)生信息表st_info, 將gender性別字段的默認(rèn)值刪除掉:
mysql> alter table st_info -> change column gender -> gender varchar(4) default null; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc st_info; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | st_id | int | NO | PRI | NULL | | | name | varchar(20) | NO | | NULL | | | class | varchar(10) | YES | | NULL | | | gender | varchar(4) | YES | | NULL | | | age | int | YES | | 18 | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
以上6個約束都很重要,并且有的可以聯(lián)合使用,并不是都是單獨(dú)使用的。作為基礎(chǔ)知識點(diǎn),會讓你的數(shù)據(jù)庫更加規(guī)范,從而提高工作效率。
總結(jié)
到此這篇關(guān)于MySQL數(shù)據(jù)庫表約束的文章就介紹到這了,更多相關(guān)MySQL表約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 數(shù)據(jù)庫備份的多種實(shí)現(xiàn)方式總結(jié)
這篇文章主要介紹了mysql 數(shù)據(jù)庫備份的多種實(shí)現(xiàn)方式,總結(jié)分析了MySQL數(shù)據(jù)庫備份的常見語句、使用方法及操作注意事項,需要的朋友可以參考下2020-02-02MySQL中動態(tài)生成SQL語句去掉所有字段的空格的操作方法
在數(shù)據(jù)庫管理過程中,我們常常會遇到需要對表中字段進(jìn)行清洗和整理的情況,本文將詳細(xì)介紹如何在MySQL中動態(tài)生成SQL語句來去掉所有字段的空格,感興趣的朋友一起看看吧2025-04-04MySQL登錄、訪問及退出操作實(shí)戰(zhàn)指南
當(dāng)我們要使用mysql時,一定要了解mysql的登錄、訪問及退出,下面這篇文章主要給大家介紹了關(guān)于MySQL登錄、訪問及退出操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10MySQL數(shù)據(jù)庫數(shù)據(jù)塊大小及配置方法
MySQL作為一種流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng),在處理大規(guī)模數(shù)據(jù)存儲和查詢時,數(shù)據(jù)塊(data block)大小是一個至關(guān)重要的因素,本文將詳細(xì)探討MySQL數(shù)據(jù)庫的數(shù)據(jù)塊大小,結(jié)合實(shí)際例子說明其重要性和配置方法,感興趣的朋友跟隨小編一起看看吧2024-05-05防止MySQL重復(fù)插入數(shù)據(jù)的三種方法
在MySQL進(jìn)行數(shù)據(jù)插入操作時,總是會考慮是否會插入重復(fù)數(shù)據(jù),之前的操作都是先根據(jù)主鍵或者唯一約束條件進(jìn)行查詢,有就進(jìn)行更新沒有就進(jìn)行插入。代碼反復(fù)效率低下。2020-09-09