mysql 表的完整性約束 [TOC] 約束概念 unsigned 設置某一個數字無符號 (整數類型 ,浮點類型不能是unsigned的) not null 某一個欄位不能為空(嚴格模式會影響非空設置的效果) default 給某個欄位設置預設值(設置預設值) unique 設置某一個欄位不能重覆 ...
目錄
mysql 表的完整性約束
約束概念
為了防止不符合規範的數據進入資料庫,在用戶對數據進行插入、修改、刪除等操作時,DBMS自動按照一定的約束條件對數據進行監測,
使不符合規範的數據不能進入資料庫,以確保資料庫中存儲的數據正確、有效、相容。
約束條件與數據類型的寬度一樣,都是可選參數,主要分為以下幾種:
# NOT NULL :非空約束,指定某列不能為空;
# UNIQUE : 唯一約束,指定某列或者幾列組合不能重覆
# PRIMARY KEY :主鍵,指定該列的值可以唯一地標識該列記錄
# FOREIGN KEY :外鍵,指定該行記錄從屬於主表中的一條記錄,主要用於參照完整性
unsigned 設置某一個數字無符號 (整數類型 ,浮點類型不能是unsigned的)
not null default create table t2(id int not null,name char(12) not null,age int default 18,
gender enum('male','female') not null default 'male');
not null 某一個欄位不能為空(嚴格模式會影響非空設置的效果)
#not null示例
mysql> create table t12 (id int not null);
Query OK, 0 rows affected (0.02 sec)
mysql> select * from t12;
Empty set (0.00 sec)
mysql> desc t12;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
row in set (0.00 sec)
#不能向id列插入空元素。
mysql> insert into t12 values (null);
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into t12 values (1);
Query OK, 1 row affected (0.01 sec)
#not null不生效
#設置嚴格模式:
不支持對not null欄位插入null值
不支持對自增長欄位插入”值
不支持text欄位有預設值
#直接在mysql中生效(設置在記憶體,重啟失效):
mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
#配置文件添加(永久生效):
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
default 給某個欄位設置預設值(設置預設值)
#我們約束某一列不為空,如果這一列中經常有重覆的內容,就需要我們頻繁的插入,這樣會給我們的操作帶來新的負擔,
於是就出現了預設值的概念。
#預設值,創建列時可以指定預設值,當插入數據時如果未主動設置,則自動添加預設值
#not null + default 示例
mysql> create table t13 (id1 int not null,id2 int not null default 222);
Query OK, 0 rows affected (0.01 sec)
mysql> desc t13;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1 | int(11) | NO | | NULL | |
| id2 | int(11) | NO | | 222 | |
+-------+---------+------+-----+---------+-------+
rows in set (0.01 sec)
# 只向id1欄位添加值,會發現id2欄位會使用預設值填充
mysql> insert into t13 (id1) values (111);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t13;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 111 | 222 |
+-----+-----+
row in set (0.00 sec)
# id1欄位不能為空,所以不能單獨向id2欄位填充值;
mysql> insert into t13 (id2) values (223);
ERROR 1364 (HY000): Field 'id1' doesn't have a default value
# 向id1,id2中分別填充數據,id2的填充數據會覆蓋預設值
mysql> insert into t13 (id1,id2) values (112,223);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t13;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 111 | 222 |
| 112 | 223 |
+-----+-----+
rows in set (0.00 sec)
unique 設置某一個欄位不能重覆 (唯一約束)
create table t3(id int unique,username char(12) unique,password char(18));
# 聯合唯一 unique(欄位1,欄位2)
create table t4(id int,ip char(15),server char(10),port int,unique(ip,port));