MySQL數(shù)據(jù)庫基本操作(二)

1.1 今日目標(biāo)

  1. 了解MySQL常用的客戶端軟件
  2. 理解整型的使用
  3. 理解浮點(diǎn)型的使用
  4. 理解字符型的使用
  5. 理解枚舉型的使用
  6. 理解集合型的使用
  7. 理解日期型的使用
  8. 理解非空約束
  9. 理解默認(rèn)值約束
  10. 理解自動增長
  11. 理解主鍵約束
  12. 理解唯一鍵約束
  13. 知道備注
  14. 知道SQL注釋
  15. 理解外鍵約束

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ù)類型的思考題

  1. 手機(jī)號碼一般使用什么數(shù)據(jù)類型存儲? char

  2. 電話號碼使用什么數(shù)據(jù)類型 varchar

  3. 性別一般使用什么數(shù)據(jù)類型存儲? char enum

  4. 學(xué)生年齡信息一般使用什么數(shù)據(jù)類型存儲? tinyint

  5. 照片信息一般使用什么數(shù)據(jù)類型存儲? binary

  6. 薪水一般使用什么數(shù)據(jù)類型存儲? decimal

多學(xué)一招:一個字段到底選數(shù)字還是字符膜眠,取決于有沒有計算的可能,如果沒有計算的可能即使是數(shù)字也要用字符類型袁翁,比如手機(jī)號柴底、QQ號,…

1.9 列屬性——是否為空(null | not null)

null:可以為空

not null:不可以為空

思考題

  1. 學(xué)員姓名允許為空嗎? 非空

  2. 家庭地址允許為空嗎? 非空

  3. 電子郵件信息允許為空嗎? 可以為空

  4. 考試成績允許為空嗎? 可以為空

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末界阁,一起剝皮案震驚了整個濱河市侯繁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泡躯,老刑警劉巖贮竟,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丽焊,死亡現(xiàn)場離奇詭異,居然都是意外死亡咕别,警方通過查閱死者的電腦和手機(jī)技健,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惰拱,“玉大人雌贱,你說我怎么就攤上這事〕ザ蹋” “怎么了欣孤?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昔逗。 經(jīng)常有香客問我导街,道長,這世上最難降的妖魔是什么纤子? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任搬瑰,我火速辦了婚禮,結(jié)果婚禮上控硼,老公的妹妹穿的比我還像新娘泽论。我一直安慰自己,他們只是感情好卡乾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布翼悴。 她就那樣靜靜地躺著,像睡著了一般幔妨。 火紅的嫁衣襯著肌膚如雪鹦赎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天误堡,我揣著相機(jī)與錄音古话,去河邊找鬼。 笑死锁施,一個胖子當(dāng)著我的面吹牛陪踩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悉抵,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼肩狂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姥饰?” 一聲冷哼從身側(cè)響起傻谁,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎列粪,沒想到半個月后审磁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆秦,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年力图,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺逼。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡妒峦,死狀恐怖浴讯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤坚俗,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站螟加,受9級特大地震影響档址,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闻察,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一拱礁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辕漂,春花似錦呢灶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跋涣,卻和暖如春缨睡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陈辱。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工奖年, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沛贪。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓拾并,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹏浅。 傳聞我的和親對象是個殘疾皇子嗅义,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容