1.1 今日目標(biāo)
- 了解MySQL常用的客戶端軟件
- 理解整型的使用
- 理解浮點(diǎn)型的使用
- 理解字符型的使用
- 理解枚舉型的使用
- 理解集合型的使用
- 理解日期型的使用
- 理解非空約束
- 理解默認(rèn)值約束
- 理解自動增長
- 理解主鍵約束
- 理解唯一鍵約束
- 知道備注
- 知道SQL注釋
- 理解外鍵約束
1.2 數(shù)據(jù)類型——值類型
1.2.1 整型
類型 | 字節(jié) | 范圍 |
---|---|---|
tinyint | 1 | -128~127 |
smallint | 2 | -32768~32767 |
mediumint | 3 | -8388608~8388607 |
int | 4 | -231~231-1 |
bigint | 8 | -263~263-1 |
1个初、無符號整數(shù)(unsigned):無符號數(shù)沒有負(fù)數(shù)碉怔,正數(shù)部分是有符號的兩倍垄潮。
例題
mysql> create table stu(
-> id smallint unsigned auto_increment primary key comment '主鍵',
-> age tinyint unsigned not null comment '年齡',
-> money bigint unsigned comment '存款'
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> desc stu;
+-------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| age | tinyint(3) unsigned | NO | | NULL | |
| money | bigint(20) unsigned | YES | | NULL | |
+-------+----------------------+------+-----+---------+----------------+
3 rows in set, 3 warnings (0.00 sec)
2、整型支持顯示寬度(最小的顯示位數(shù)) 比如int(5),如果數(shù)值的位數(shù)小于5位俐筋,前面加上前導(dǎo)0曙求。比如輸入12,顯示00012了赌;大于5位就不添加前導(dǎo)0。
腳下留心:必須結(jié)合zerofill才起作用
mysql> create table stu(
-> id int(5),
-> age int(5) zerofill # 填充前導(dǎo)0
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc stu;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| age | int(5) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
mysql> insert into stu values (1,11);
mysql> insert into stu values (1111111,2222222);
Query OK, 1 row affected (0.00 sec)
mysql> select * from stu;
+---------+---------+
| id | age |
+---------+---------+
| 1 | 00011 |
| 1111111 | 2222222 | # 注意:age填充了前導(dǎo)0
+---------+---------+
2 rows in set (0.00 sec)
1.2.2 浮點(diǎn)型(保存近似值小數(shù))
浮點(diǎn)型 | 占用字節(jié) | 范圍 |
---|---|---|
float(單精度) | 4 | -3.4E+38~3.4E+38 |
double(雙精度) | 8 | -1.8E+308~1.8E+308 |
1玄糟、浮點(diǎn)數(shù)聲明: float(M,D) double(M,D)
M:總位數(shù)
D:小數(shù)位數(shù)
例題勿她;
mysql> create table t1(
-> num1 float(5,2), #總位數(shù)是5,小數(shù)位數(shù)是2阵翎,那么整數(shù)位數(shù)是3逢并,
-> num2 double(4,1)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> insert into t1 values (1.23,1.23); #如果精度超出了允許的范圍,會四舍五入
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+------+
| num1 | num2 |
+------+------+
| 1.23 | 1.2 | #如果精度超出了允許的范圍郭卫,會四舍五入
+------+------+
1 row in set (0.00 sec)
2砍聊、浮點(diǎn)的精度可能會丟失【精度指的是小數(shù)】
1.2.3 定點(diǎn)數(shù)
語法:decimal(M,D)
mysql> create table t4(
-> num decimal(20,19)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t4 values (1.1234567890123456789);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t4;
+-----------------------+
| num |
+-----------------------+
| 1.1234567890123456789 |
+-----------------------+
1 row in set (0.00 sec)
多學(xué)一招:
1、定點(diǎn)數(shù)是變長的贰军,大致每9個數(shù)字用4個字節(jié)來存儲玻蝌。定點(diǎn)數(shù)之所以能保存精確的小數(shù),因?yàn)檎麛?shù)和小數(shù)是分開存儲的词疼。占用的資源比浮點(diǎn)數(shù)要多俯树。
2、定點(diǎn)數(shù)和浮點(diǎn)數(shù)都支持顯示寬度和無符號數(shù)贰盗。
1.3 數(shù)據(jù)類型——字符型
數(shù)據(jù)類型 | 描述 | 長度 |
---|---|---|
char(長度) | 定長 | 最大255 |
varchar(長度) | 變長 | 最大65535 |
tinytext | 大段文本 | 28-1=255 |
text | 大段文本 | 216-1=65535 |
mediumtext | 大段文本 | 224-1 |
longtext | 大段文本 | 232-1 |
1许饿、char(10)和varchar(10)的區(qū)別?
答:相同點(diǎn):它們最多只能保存10個字符舵盈;
不同點(diǎn):char不回收多余的字符陋率,varchar會回收多余的字符。
char效率高秽晚,浪費(fèi)空間瓦糟,varchar節(jié)省空間,效率比char低赴蝇。
2狸页、char的最大長度是255。
3、varchar理論長度是65535字節(jié),實(shí)際根本達(dá)不到芍耘。具體長度與字符編碼有關(guān)址遇。
4、一個記錄的總長度不能超過65535個字節(jié)斋竞。
5倔约、大塊文本(text)不計算在總長度中,一個大塊文本只占用10個字節(jié)來保存文本的地址。
1.4 數(shù)據(jù)類型——枚舉(enum)
1坝初、從集合中選擇一個數(shù)據(jù)(單選)
mysql> create table t8(
-> name varchar(20),
-> sex enum('男','女','保密') # 枚舉
-> )charset=utf8;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t8 values ('tom','男');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t8 values ('berry','女');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t8 values ('rose','未知'); # 報錯浸剩,只能插入枚舉值
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> select * from t8;
+-------+------+
| name | sex |
+-------+------+
| tom | 男 |
| berry | 女 |
+-------+------+
2、MySQL的枚舉類型是通過整數(shù)來管理的鳄袍,第一個值是1绢要,第二個值是2,以此類推拗小。
mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
| 1 |
| 2 |
+-------+
3重罪、既然枚舉在數(shù)據(jù)庫內(nèi)部存儲的是整數(shù),那么可以直接插入數(shù)字
mysql> insert into t8 values ('rose',3); # 可以直接插入數(shù)字
Query OK, 1 row affected (0.00 sec)
mysql> select * from t8;
+-------+------+
| name | sex |
+-------+------+
| tom | 男 |
| berry | 女 |
| rose | 保密 |
+-------+------+
3 rows in set (0.00 sec)
枚舉的優(yōu)點(diǎn):
1哀九、 運(yùn)行速度快(數(shù)字比字符串運(yùn)算速度快)
2剿配、 限制數(shù)據(jù),保證數(shù)據(jù)完整性
3阅束、 節(jié)省空間
思考:已知枚舉占用2個字節(jié)呼胚,請問最多有多少個枚舉值?
答:2個字節(jié)=16位息裸,可以保存數(shù)字(0-65535)蝇更,枚舉是從1開始,所以枚舉最多可以有65535個枚舉值呼盆。
1.5 數(shù)據(jù)類型——集合(set)
從集合中選擇一些數(shù)據(jù)(多選)
mysql> create table t9(
-> hobby set('爬山','讀書','游泳','敲代碼')
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> insert into t9 values ('爬山');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 values ('爬山,游泳');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 values ('游泳,爬山'); # 插入順序不一樣年扩,但是顯示的順序是一樣的
Query OK, 1 row affected (0.02 sec)
mysql> insert into t9 values ('爬山,游泳,開車'); # 報錯,插入集合中沒有的選項會報錯
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
每個集合的元素都分配一個固定的數(shù)字宿亡,分配的方式從左往右按2的0、1纳令、2挽荠、…次方
思考:已知集合占用8個字節(jié),最多可以表示幾個選項平绩?
答:8個字節(jié)=64位圈匆,一個位表示1個選項,最多可以表示64個選項捏雌。
1.6 數(shù)據(jù)類型——日期類型
數(shù)據(jù)類型 | 描述 |
---|---|
datetime | 日期時間跃赚,占用8個字節(jié) |
date | 日期 占用3個字節(jié) |
time | 時間 占用3個字節(jié) |
timestamp | 時間戳,占用4個字節(jié) |
year | 年份 占用1個字節(jié) |
1、datetime 格式:年-月-日 小時:分鐘:秒
mysql> create table t10(
-> field datetime
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t10 values ('2025-10-12 10:12:36');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t10 values ('100-10-12 10:12:36');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t10 values ('10000-10-12 10:12:36'); #datetime保存范圍是:1~9999年
ERROR 1292 (22007): Incorrect datetime value: '10000-10-12 10:12:36' for column 'field' at row 1
mysql> select * from t10;
+---------------------+
| field |
+---------------------+
| 2025-10-12 10:12:36 |
| 0100-10-12 10:12:36 |
+---------------------+
2 rows in set (0.00 sec)
2纬傲、date 日期格式
mysql> create table t11(
-> field date
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t11 values ('2025-10-12');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t11;
+------------+
| field |
+------------+
| 2025-10-12 |
+------------+
3满败、timestamp:時間戳
timestamp類型和 datetime類型在表現(xiàn)上是一樣的。他們的區(qū)別:
datetime是從1到9999叹括,而timestamp從1970年~2038年算墨,2038年01月19日11:14:07秒以后就超出timestamp范圍了。
mysql> create table t12(
-> field timestamp
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t12 values ('1975-5-5 12:12:12');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t12 values ('1969-5-5 12:12:12'); # 超出范圍
ERROR 1292 (22007): Incorrect datetime value: '1969-5-5 12:12:12' for column 'field' at row 1
mysql> insert into t12 values ('2038-1-19 11:14:07');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t12 values ('2038-1-19 11:14:08'); # 超出范圍
ERROR 1292 (22007): Incorrect datetime value: '2038-1-19 11:14:08' for column 'field' at row 1
mysql> select * from t12;
+---------------------+
| field |
+---------------------+
| 1975-05-05 12:12:12 |
| 2038-01-19 11:14:07 |
+---------------------+
4汁雷、year
因?yàn)橹徽加?個字節(jié)净嘀,最多只能表示255個年份,范圍是1901-2155之間的年份
mysql> create table t13(
-> field year
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t13 values (2025);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t13 values (1900); # 超出范圍
ERROR 1264 (22003): Out of range value for column 'field' at row 1
mysql> insert into t13 values (2155);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t13 values (2156); # 超出范圍
ERROR 1264 (22003): Out of range value for column 'field' at row 1
5侠讯、time 表示時間或時間間隔挖藏,范圍是-838:59:59~838:59:59
mysql> create table t14(
-> field time
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t14 values ('12:12:12');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t14 values ('212:12:12');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t14 values ('838:59:59');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t14 values ('839:00:00'); # 操作范圍
ERROR 1292 (22007): Incorrect time value: '839:00:00' for column 'field' at row 1
mysql>
多學(xué)一招:time支持以天的方式插入
mysql> insert into t14 values ('10 10:10:10');
Query OK, 1 row affected (0.02 sec)
mysql> select * from t14;
+-----------+
| field |
+-----------+
| 12:12:12 |
| 212:12:12 |
| 838:59:59 |
| 250:10:10 |
+-----------+
1.7 數(shù)據(jù)類型——boolean
MySQL不支持boolean類型,true和false在數(shù)據(jù)庫中對應(yīng)1和0厢漩。
mysql> create table t15(
-> field boolean
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t15 values (true),(false); # true和false在數(shù)據(jù)庫中對應(yīng)1和0
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t15;
+-------+
| field |
+-------+
| 1 |
| 0 |
+-------+
2 rows in set (0.00 sec)
1.8 關(guān)于數(shù)據(jù)類型的思考題
手機(jī)號碼一般使用什么數(shù)據(jù)類型存儲? char
電話號碼使用什么數(shù)據(jù)類型 varchar
性別一般使用什么數(shù)據(jù)類型存儲? char enum
學(xué)生年齡信息一般使用什么數(shù)據(jù)類型存儲? tinyint
照片信息一般使用什么數(shù)據(jù)類型存儲? binary
薪水一般使用什么數(shù)據(jù)類型存儲? decimal
多學(xué)一招:一個字段到底選數(shù)字還是字符膜眠,取決于有沒有計算的可能,如果沒有計算的可能即使是數(shù)字也要用字符類型袁翁,比如手機(jī)號柴底、QQ號,…
1.9 列屬性——是否為空(null | not null)
null:可以為空
not null:不可以為空
思考題
學(xué)員姓名允許為空嗎? 非空
家庭地址允許為空嗎? 非空
電子郵件信息允許為空嗎? 可以為空
考試成績允許為空嗎? 可以為空
1.10 列屬性——默認(rèn)值(default)
1粱胜、如果一個字段沒有插入值柄驻,可以默認(rèn)插入一個指定的值。
2焙压、default關(guān)鍵字用來插入默認(rèn)值
mysql> create table t16(
-> id int unsigned,
-> addr varchar(20) not null default '地址不詳'
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t16 values (1,'北京'),(2,default);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t16;
+------+----------+
| id | addr |
+------+----------+
| 1 | 北京 |
| 2 | 地址不詳 |
+------+----------+
2 rows in set (0.00 sec)
1.11 列屬性——自動增長(auto_increment)
1鸿脓、字段的值從1開始,每次遞增1涯曲,特點(diǎn)就在字段中的數(shù)據(jù)不可能重復(fù)野哭,適合為記錄生成唯一的id
2、自動增長都是無符號整數(shù)幻件。
3拨黔、在MySQL中,auto_increment必須是主鍵绰沥。但是主鍵不一定是自動增長的篱蝇。
4、如果要給自動增長列插入數(shù)據(jù)徽曲,使用null關(guān)鍵字零截。
5、自動增長列上的數(shù)據(jù)被刪除秃臣,默認(rèn)情況下此記錄的編號不再使用涧衙。
1.12 列屬性——主鍵(primary key)
主鍵:唯一標(biāo)識表中記錄的一個或一組列
主鍵的特點(diǎn):不能重復(fù),不能為空
一個表只能有一個主鍵,主鍵可以有多個字段組成弧哎。
主鍵的作用:
1雁比、 保證數(shù)據(jù)完整性
2、 加快查詢速度
1.12.1 添加主鍵
方法一:創(chuàng)建表的時候添加主鍵
mysql> create table t17(
-> id varchar(5) primary key, # 創(chuàng)建主鍵
-> name varchar(10) not null
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t17 values ('s2531','tom'),('s2532','berry');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t17;
+-------+-------+
| id | name |
+-------+-------+
| s2531 | tom |
| s2532 | berry |
+-------+-------+
2 rows in set (0.00 sec)
# 如果插入主鍵相同數(shù)據(jù)會報錯
mysql> insert into t17 values ('s2531','tom');
ERROR 1062 (23000): Duplicate entry 's2531' for key 'PRIMARY'
# 主鍵不能插入null值
mysql> insert into t17 values (null,'tom');
ERROR 1048 (23000): Column 'id' cannot be null
方法二:創(chuàng)建表的時候添加主鍵
mysql> create table t18(
-> id int,
-> name varchar(10),
-> primary key(id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc t18;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
方法三:更改表的時候添加主鍵
mysql> create table t20(
-> id int,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> alter table t20 add primary key (id); # 更改表添加主鍵
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t20;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
1.12.2 創(chuàng)建組合鍵
mysql> create table t19(
-> classid int,
-> stuid int,
-> stuname varchar(10),
-> primary key(classid, stuid)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t19;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| classid | int(11) | NO | PRI | NULL | |
| stuid | int(11) | NO | PRI | NULL | |
| stuname | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
1.12.3 查看主鍵
mysql> desc t19;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| classid | int(11) | NO | PRI | NULL | |
| stuid | int(11) | NO | PRI | NULL | |
| stuname | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
1.12.3 刪除主鍵
mysql> alter table t19 drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t19;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| classid | int(11) | NO | | NULL | |
| stuid | int(11) | NO | | NULL | |
| stuname | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
1.12.4 選擇主鍵的原則
1傻铣、 最少性:盡量選擇一個字段做主鍵
2章贞、 穩(wěn)定性:盡量選擇更新少的列做主鍵
3、 盡量選擇數(shù)字型的列做主鍵
1.12.5 主鍵思考題
1非洲、在主鍵列輸入的數(shù)值鸭限,允許為空嗎? 不可以
2、 一個表可以有多個主鍵嗎? 不可以
3两踏、 在一個學(xué)校數(shù)據(jù)庫中败京,如果一個學(xué)校內(nèi)允許重名的學(xué)員,但是一個班級內(nèi)不允許學(xué)員重名梦染,可以組合班級和姓名兩個字段一起來作為主鍵嗎赡麦? 可以
4、 標(biāo)識列(自動增長列)允許為字符數(shù)據(jù)類型嗎帕识? 不可以
5泛粹、 表中沒有合適的列作為主鍵怎么辦? 添加自動增加列
6肮疗、 如果標(biāo)識列A的初始值為1晶姊,增長量為1,則輸入三行數(shù)據(jù)以后伪货,再刪除兩行们衙,下次再輸入數(shù)據(jù)行的時候,標(biāo)識值從多少開始碱呼? 從4開始
1.13 列屬性——唯一鍵
特點(diǎn):
1蒙挑、不能重復(fù),可以為空
2愚臀、一個表可以有多個唯一鍵
作用:
1忆蚀、 保證數(shù)據(jù)不能重復(fù)。保證數(shù)據(jù)完整性
2姑裂、 加快數(shù)據(jù)訪問
1.13.1 添加唯一鍵
方法一:創(chuàng)建表的時候添加唯一鍵
mysql> create table t22(
-> id int primary key,
-> name varchar(20) unique, #通過unique添加唯一鍵
-> addr varchar(100) unique
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t22 values (1,'tom','上海');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t22 values (2,'tom','北京'); # name重復(fù)了馋袜,報錯
ERROR 1062 (23000): Duplicate entry 'tom' for key 'name'
mysql> insert into t22 values (2,'berry','上海'); # addr重復(fù)了
ERROR 1062 (23000): Duplicate entry '上海' for key 'addr'
還有一種方法
mysql> create table t26(
-> id int,
-> name varchar(20),
-> addr varchar(20),
-> primary key(id),
-> unique (name), # 添加唯一鍵
-> unique (addr)
-> );
Query OK, 0 rows affected (0.06 sec)
方法二:修改表的時候添加唯一鍵
mysql> create table t23(
-> id int primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> alter table t23 add unique (name); # 添加一個唯一鍵
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
一次添加多個唯一鍵
mysql> create table t24(
-> id int primary key,
-> name varchar(20),
-> addr varchar(20)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> alter table t24 add unique(name),add unique(addr);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
添加組合唯一鍵
mysql> create table t25(
-> id int primary key,
-> name varchar(20),
-> addr varchar(20)
-> );
Query OK, 0 rows affected (0.09 sec)
mysql> alter table t25 add unique(name,addr);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
1.13.2查看唯一鍵
mysql> show create table t26\G
*************************** 1. row ***************************
Table: t26
Create Table: CREATE TABLE `t26` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(20) DEFAULT NULL,
`addr` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`), # 唯一鍵
UNIQUE KEY `addr` (`addr`) # 唯一鍵
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> show create table t25\G
*************************** 1. row ***************************
Table: t25
Create Table: CREATE TABLE `t25` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`addr` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`,`addr`) # 組合唯一鍵
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
添加唯一鍵,給唯一鍵取名
mysql> create table t27(
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> alter table t27 add unique UQ_name(name);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t27\G
*************************** 1. row ***************************
Table: t27
Create Table: CREATE TABLE `t27` (
`name` varchar(20) DEFAULT NULL,
UNIQUE KEY `UQ_name` (`name`) # 唯一鍵的名字是UQ_name
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
1.13.3 刪除唯一鍵
通過唯一鍵的名字來刪除唯一鍵
語法:alter table 表名 drop index 唯一鍵名稱
問題:主鍵和唯一鍵的區(qū)別炭分?
1桃焕、主鍵不能重復(fù)剑肯,不能為空捧毛,唯一鍵不能重復(fù),可以為空
2、主鍵只有一個呀忧,唯一鍵可以有多個师痕。
1.14列屬性——備注(comment)
為了程序員之間的相互交流
1.15 SQL注釋
單行注釋:--或#
多行注釋:/* */
1.16 數(shù)據(jù)完整性介紹
1.16.1 保證實(shí)體完整性
1、 主鍵約束
2而账、 唯一約束
3胰坟、 自動增長列
1.16.2 保證域完整性
1、 數(shù)據(jù)類型約束
2泞辐、 非空約束
3笔横、 默認(rèn)值約束
1.16.3 保證引用完整性
1、外鍵約束:從表中的公共字段是主表的外鍵
1.17 引用完整性
1.17.1 主表和從表
兩個表建立關(guān)系(兩個表只要有公共字段就有關(guān)系)咐吼,一個表稱為主表吹缔,一個表稱為從表。
外鍵約束可以實(shí)現(xiàn):
1锯茄、 主表中沒有的從表中不允許插入
2厢塘、 從表中有的主表中不允許刪除
3、 不能更改主表中的值而導(dǎo)致從表中的記錄孤立存在肌幽。
4晚碾、 先刪除從表,再刪除主表
1.17.2 外鍵(foreign key)
1喂急、 外鍵:從表中的公共字段格嘁,公共字段的名字可以不一樣,但是數(shù)據(jù)類型必須一樣煮岁。
2讥蔽、 外鍵約束用來保證引用完整性
1.17.3 添加外鍵
方法一:創(chuàng)建表的時候添加外鍵
create table stuinfo(
stuno char(4) primary key,
name varchar(10) not null
);
create table stumarks(
stuid char(4) primary key,
score tinyint unsigned,
foreign key (stuid) references stuinfo(stuno)
);
方法二:修改表的時候添加外鍵
mysql> create table stuinfo(
-> stuno char(4) primary key,
-> name varchar(10) not null
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> create table stumarks(
-> stuid char(4) primary key,
-> score tinyint unsigned
-> );
Query OK, 0 rows affected (0.06 sec)
語法: alter table 從表 add foreign key (從表的公共字段) references 主表(公共字段)
mysql> alter table stumarks add foreign key (stuid) references stuinfo(stuno);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
腳下留心:要創(chuàng)建外鍵必須是innodb引擎,myisam不支持外鍵約束
1.17.4 查看外鍵
語法:show create table 表名\G
1.17.5 刪除外鍵
通過外鍵的名字刪除外鍵
語法:alter table 表名 drop foreign key 外鍵名
例題
mysql> alter table stumarks drop foreign key stumarks_ibfk_1;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
1.18 外鍵操作
1画机、 嚴(yán)格操作(前面講的是嚴(yán)格操作)
2冶伞、 置空操作(set null):如果主表記錄刪除或更新,從表置空
3步氏、 級聯(lián)操作(cascade):如果主表記錄刪除或更新响禽,從表級聯(lián)
一般來說:主表刪除的時候,從表置空操作荚醒,主表更新的時候芋类,從表級聯(lián)操作。
語法:foreign key(外鍵) references 主表(關(guān)鍵字段)[主表刪除是的動作][主表更新時候的動作]
例題
mysql> create table stuinfo(
-> stuno char(4) primary key,
-> name varchar(10) not null
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> create table stumarks(
-> stuid int auto_increment primary key,
-> stuno char(4) ,
-> score tinyint unsigned,
-> foreign key (stuno) references stuinfo(stuno) on delete set null on update cascade
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into stuinfo values ('s101','tom');
Query OK, 1 row affected (0.00 sec)
mysql> insert into stumarks values (null,'s101',88);
Query OK, 1 row affected (0.00 sec)
mysql> select * from stuinfo;
+-------+------+
| stuno | name |
+-------+------+
| s101 | tom |
+-------+------+
1 row in set (0.00 sec)
mysql> update stuinfo set stuno='s102' where stuno='s101'; # 更新時級聯(lián)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from stumarks;
+-------+-------+-------+
| stuid | stuno | score |
+-------+-------+-------+
| 1 | s102 | 88 |
+-------+-------+-------+
1 row in set (0.00 sec)
mysql> delete from stuinfo where stuno='s102'; # 刪除時置空
Query OK, 1 row affected (0.02 sec)
mysql> select * from stumarks;
+-------+-------+-------+
| stuid | stuno | score |
+-------+-------+-------+
| 1 | NULL | 88 |
+-------+-------+-------+
1 row in set (0.00 sec)