最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)庫表約束超詳細(xì)講解

 更新時(shí)間:2023年11月21日 16:41:24   作者:Bridge?Fish  
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫表約束的相關(guān)資料,MySQL?約束是用于保持?jǐn)?shù)據(jù)完整性和一致性的規(guī)則,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在MySQL里,“約束”指的是對表中數(shù)據(jù)的一種限制約束,它能夠確保數(shù)據(jù)庫中數(shù)據(jù)的準(zhǔn)確性和有效性

比如有的數(shù)據(jù)是必填項(xiàng),就像身份認(rèn)證的時(shí)候,或者填注冊信息的時(shí)候,手機(jī)號身份證這種就不能空著,所以就有了非空約束;又有的數(shù)據(jù)比如用戶的唯一id,不能跟其他人的一樣,所以就需要使用唯一約束等等。

在MySQL中主要有6種約束:主鍵約束、外鍵約束、唯一約束、檢查約束、非空約束和默認(rèn)值約束。

一. 主鍵約束——PRIMARY KEY

“主鍵約束“是6種約束中使用最多的約束。

在建立數(shù)據(jù)表的時(shí)候,一般情況下,為了方便更快地查找表中的記錄,都會要求在表中設(shè)置一個(gè)“主鍵”。”主鍵“是表里面的一個(gè)特殊字段,這個(gè)字段能夠唯一標(biāo)識該表中的每條信息。

主鍵分為“單字段主鍵”和“多字段聯(lián)合主鍵”,并且在使用主鍵的時(shí)候需要注意以下幾個(gè)點(diǎn):

  • 一個(gè)表只能定義一個(gè)主鍵;
  • 主鍵值必須唯一標(biāo)識表中的每一行,并且不能出現(xiàn)null的情況,即表中不能存在有相同主鍵的兩行或兩行以上數(shù)據(jù),嚴(yán)格遵守唯一性原則
  • 一個(gè)字段名只能在聯(lián)合主鍵字段表中出現(xiàn)一次;
  • 聯(lián)合主鍵不能包含不必要的多余字段,以滿足最小化原則

1.在建表時(shí)設(shè)置主鍵約束

設(shè)置單字段主鍵

1)在定義字段的時(shí)候設(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)合主鍵即一張表的主鍵由多個(gè)字段組成。

比如在學(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)合主鍵的時(shí)候,不能在每個(gè)字段名后面直接聲明主鍵約束。

2. 在修改表的時(shí)候添加主鍵約束

如果在創(chuàng)建表的時(shí)候沒有設(shè)置主鍵約束,還可以在修改表時(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_idname設(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)一個(gè)表中不需要主鍵約束時(shí),就需要從表中將其刪除。

 刪除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)
);

此時(shí)可以不用再手動插入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é)號的時(shí)候不一定是從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)生了報(bào)錯(cuò),則最終自增字段可能會出現(xiàn)不連續(xù)的情況。

二. 外鍵約束——FOREIGN KEY

外鍵約束是表的一個(gè)特殊字段,普遍會和主鍵約束一起使用,用來確保數(shù)據(jù)的一致性。

對于兩個(gè)具有關(guān)聯(lián)關(guān)系的表來說,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。

所以外鍵就是用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性。

在定義外鍵時(shí)需要遵守以下規(guī)則:

  • 主表必須已經(jīng)存在于數(shù)據(jù)庫中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個(gè)表,這樣的表稱做自參照表,這種結(jié)構(gòu)稱做自參照完整性;
  • 必須為主表定義主鍵;
  • 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值;
  • 在主表的表名后面指定列名或列名的組合,這個(gè)列或列的組合必須是主表的主鍵或候選鍵;
  • 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同;
  • 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對應(yīng)列的數(shù)據(jù)類型相同。

1.在創(chuàng)建表時(shí)設(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_coursecourse_id字段,依賴于表st_info5的主鍵st_id。

2. 在修改表時(shí)添加外鍵約束

同樣的可以在創(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)一個(gè)表中不需要外鍵約束時(shí),就需要從表中將其刪除。外鍵一旦刪除,就會解除主表和從表間的關(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ù)的情況。

唯一約束與主鍵約束有一個(gè)相似的地方,就是它們都能夠確保列的唯一性。與主鍵約束不同的是,唯一約束在一個(gè)表中可以有多個(gè),并且設(shè)置唯一約束的列是允許有空值的,雖然只能有一個(gè)空值。

例如,在用戶信息表中,要避免表中的用戶名重名,就可以把用戶名列設(shè)置為唯一約束。

1.在創(chuàng)建表時(shí)設(shè)置唯一約束

唯一約束可以在創(chuàng)建表的時(shí)候直接進(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. 在修改表時(shí)添加唯一約束

語法格式:

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è)置字段的檢查約束時(shí)需要根據(jù)實(shí)際情況進(jìn)行設(shè)置,這樣能夠減少無效數(shù)據(jù)的輸入。

1.在創(chuàng)建表時(shí)設(shè)置檢查約束

語法格式:

CHECK(<約束條件>)

 在persons表創(chuàng)建時(shí)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. 在修改表時(shí)添加檢查約束

語法格式:

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

非空約束是用來約束表中的字段不能為空。在表中某個(gè)列的定義后加上關(guān)鍵字NOT NULL作為限定詞,來約束該列的取值不能為空。

例如,在學(xué)生信息表中,如果不添加學(xué)生姓名,那么這條記錄是無效的,這種情況下就可以為用戶名字段設(shè)置非空約束。

1.在創(chuàng)建表時(shí)設(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. 在修改表時(shí)添加非空約束:

如果在創(chuàng)建表的時(shí)候忘記了為字段設(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ù)表中某個(gè)字段不輸入值的時(shí)候,自動為其添加一個(gè)已經(jīng)設(shè)置好的值。

例如,在注冊學(xué)生信息時(shí),如果不輸入學(xué)生的性別,那么會默認(rèn)設(shè)置一個(gè)性別或者輸入一個(gè)“未知”。

默認(rèn)值約束一般是用在已經(jīng)設(shè)置了非空約束的列,這樣能夠防止數(shù)據(jù)表在錄入數(shù)據(jù)時(shí)出現(xiàn)錯(cuò)誤。

1.在創(chuàng)建表時(shí)設(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. 在修改表時(shí)添加默認(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個(gè)約束都很重要,并且有的可以聯(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)文章

  • 使用MyCat實(shí)現(xiàn)MySQL主從讀寫分離全過程

    使用MyCat實(shí)現(xiàn)MySQL主從讀寫分離全過程

    本文介紹MySQL讀寫分離原理及實(shí)現(xiàn)方式,重點(diǎn)講解MyCat中間件的配置與使用,涵蓋主從復(fù)制、邏輯庫路由、負(fù)載均衡等,旨在提升高并發(fā)場景下數(shù)據(jù)庫性能,降低應(yīng)用與數(shù)據(jù)庫耦合度,適用于企業(yè)級架構(gòu)優(yōu)化
    2025-09-09
  • 簡單實(shí)現(xiàn)MySQL服務(wù)器的優(yōu)化配置方法

    簡單實(shí)現(xiàn)MySQL服務(wù)器的優(yōu)化配置方法

    我們今天主要向大家描述的是MySQL服務(wù)器的優(yōu)化配置的時(shí)機(jī)操作步驟,以及在MySQL服務(wù)器的優(yōu)化配置的的過程中值得我們主義的事項(xiàng)的介紹。
    2011-03-03
  • MySQL生僻字插入失敗的處理方法(Incorrect string value)

    MySQL生僻字插入失敗的處理方法(Incorrect string value)

    最近,業(yè)務(wù)方反饋有個(gè)別用戶信息插入失敗,報(bào)錯(cuò)提示類似Incorrect string value:"\xF0\xA5 .....看這個(gè)提示應(yīng)該是字符集不支持某個(gè)生僻字造成的,需要的朋友可以參考下
    2017-05-05
  • Navicat Premium15連接云服務(wù)器中的數(shù)據(jù)庫問題及遇到坑

    Navicat Premium15連接云服務(wù)器中的數(shù)據(jù)庫問題及遇到坑

    這篇文章主要介紹了Navicat Premium15連接云服務(wù)器中的數(shù)據(jù)庫問題及遇到坑,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • MySQL綠色版設(shè)置編碼以及1067錯(cuò)誤詳解

    MySQL綠色版設(shè)置編碼以及1067錯(cuò)誤詳解

    這篇文章主要介紹了MySQL綠色版設(shè)置編碼,以及1067錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • mysql ON DUPLICATE KEY UPDATE語句示例

    mysql ON DUPLICATE KEY UPDATE語句示例

    本文介紹一下關(guān)于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法
    2013-11-11
  • Windows系統(tǒng)下MySQL ODBC驅(qū)動安裝與配置詳細(xì)步驟

    Windows系統(tǒng)下MySQL ODBC驅(qū)動安裝與配置詳細(xì)步驟

    本文介紹Windows系統(tǒng)下MySQL ODBC驅(qū)動的安裝與配置步驟,涵蓋系統(tǒng)架構(gòu)確認(rèn)、驅(qū)動下載選擇、DSN配置、ANSI/Unicode驅(qū)動區(qū)別及常見問題解決方案,同時(shí)提供自動化部署腳本,幫助用戶解決驅(qū)動未顯示、位數(shù)沖突、連接失敗等典型問題,感興趣的朋友一起看看吧
    2025-06-06
  • MySQL使用binlog日志回滾操作失誤的數(shù)據(jù)的操作教程

    MySQL使用binlog日志回滾操作失誤的數(shù)據(jù)的操作教程

    在日常開發(fā)運(yùn)維中,我們可能會出現(xiàn)一些操作失誤的情況,比如使用了錯(cuò)誤的 sql 語句對 mysql 數(shù)據(jù)進(jìn)行了 update、delete 等操作,失誤操作導(dǎo)致數(shù)據(jù)出現(xiàn)問題,那么如果出現(xiàn)這種情況,應(yīng)該如何恢復(fù)失誤/mysql 誤刪數(shù)據(jù)時(shí),本文將使用幾種常用方法帶你回滾誤刪的數(shù)據(jù)
    2025-08-08
  • MySQL 數(shù)據(jù)表修復(fù)方法小結(jié)

    MySQL 數(shù)據(jù)表修復(fù)方法小結(jié)

    本文主要介紹了MySQL 數(shù)據(jù)表修復(fù)方法小結(jié),使用REPAIR TABLE命令修復(fù)損壞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • MySQL 復(fù)制表詳解及實(shí)例代碼

    MySQL 復(fù)制表詳解及實(shí)例代碼

    這篇文章主要介紹了MySQL 復(fù)制表詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評論

彰化市| 浮山县| 华安县| 神池县| 沿河| 肃北| 宜良县| 岳阳县| 潍坊市| 临夏县| 筠连县| 伊春市| 六枝特区| 竹北市| 西乡县| 黄平县| 吉首市| 丹寨县| 台湾省| 喜德县| 宝清县| 梅河口市| 二手房| 洪泽县| 积石山| 长春市| 北流市| 汤阴县| 宜州市| 濮阳县| 嘉善县| 博客| 西安市| 天气| 巧家县| 库车县| 江西省| 清徐县| 松潘县| 通化县| 雅江县|