1. 程式人生 > 實用技巧 >MySQL資料庫之列屬性

MySQL資料庫之列屬性

列屬性

是否為空

  • 是否為空
    • null 表示欄位值可以為null
    • not null欄位值不能為空

預設值

  • 預設值
    • 如果一個欄位沒有插入值,可以預設插入一個指定的值
    • default 關鍵字用來插入預設值
mysql> create table stu19(
    -> name varchar(20) not null default '姓名不詳',
    -> addr varchar(50) not null default '地址不詳'
    -> );
# `Query OK, 0 rows affected (0.05 sec)`

mysql> insert into stu19(name) values ('tom');
# `Query OK, 1 row affected (0.00 sec)`

mysql> insert into stu19 values (default,default);
# `Query OK, 1 row affected (0.00 sec)`

mysql> select * from stu19;
+----------+----------+
| name     | addr     |
+----------+----------+
| tom      | 地址不詳  |
| 姓名不詳  | 地址不詳 |
+----------+----------+
# `2 rows in set (0.00 sec)`

自動增長

  • 自動增長
    • 欄位值從1開始,每次遞增1,自動增長的值就不會有重複,適合用來生成唯一的id
    • 在MySQL中只要是自動增長列必須是主鍵
    • auto_increment 關鍵字用來設定自動增長

主鍵

  • 概念

    • 唯一標識表中的記錄的一個或一組列稱為主鍵
    • primary key 關鍵字用來設定主鍵
  • 特點

    • 不能重複、不能為空
    • 一個表只能有一個主鍵
  • 作用

    • 保證資料完整性
    • 加快查詢速度
  • 原則

    • 最少性:儘量選擇單個鍵作為主鍵
    • 穩定性:儘量選擇數值更新少的列作為主鍵
    • 比如:
      • 學號 姓名 地址 這三個欄位都不重複
      • 選哪個做主鍵?
      • 選學號,因為學號最穩定
  • 應用

    • 只要是auto_increment必須是主鍵,但是主鍵不一定是auto_increment
    • 主鍵特點是不能重複不能為空
    • 一個表只能有一個主鍵,但是一個主鍵可以有多個欄位組成
    • 自動增長列通過插入null值讓其遞增
    • 自動增長列的資料被刪除,預設不再重複使用。
    • truncate table刪除資料後(清空表格),再次插入從1開始
  • 練習

    • 在主鍵列輸入的數值,允許為空嗎? false
    • 一個表可以有多個主鍵嗎? false
    • 在一個學校資料庫中,如果一個學校內允許重名的學員,但是一個班級內不允許學員重名,可以組合班級和姓名兩個欄位一起來作為主鍵嗎? true
    • 標識列(自動增長列)允許為字元資料型別嗎? false
    • 一個自動增長列中,插入3行,刪除2行,插入3行,刪除2行,插入3行,刪除2行,再次插入是多少? 10

建立主鍵

mysql> create table stu20(
    -> id int auto_increment primary key,
    -> name varchar(20)
    -> );
# `Query OK, 0 rows affected (0.04 sec)`
mysql> create table stu21(
    -> id int auto_increment,
    -> name varchar(20),
    -> primary key(id)
    -> );
# `Query OK, 0 rows affected (0.02 sec)`

建立組合主鍵

mysql> create table stu22(
    -> classname varchar(20),
    -> stuname varchar(20),
    -> primary key(classname,stuname)  
    -> );
# `Query OK, 0 rows affected (0.00 sec)`

mysql> desc stu22;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| classname | varchar(20) | NO   | PRI |         |       |
| stuname   | varchar(20) | NO   | PRI |         |       |
+-----------+-------------+------+-----+---------+-------+
# `2 rows in set (0.00 sec)`

更改表新增主鍵

-- 建立表
mysql> create table stu23(
    -> id int,
    -> name varchar(20)
    -> );
# `Query OK, 0 rows affected (0.05 sec)`

-- 新增主鍵
mysql> alter table stu23 add primary key(id);
# `Query OK, 0 rows affected (0.09 sec)`
# `Records: 0  Duplicates: 0  Warnings: 0`

刪除主鍵

mysql> alter table stu23 drop primary key;
# `Query OK, 0 rows affected (0.03 sec)`
# `Records: 0  Duplicates: 0  Warnings: 0`

插入資料

mysql> create table stu25(
    -> id tinyint unsigned auto_increment primary key,
    -> name varchar(20)
    -> );
# `Query OK, 0 rows affected (0.05 sec)`

-- 插入資料
mysql> insert into stu25 values (3,'tom');   -- 可以直接插入數字
# `Query OK, 1 row affected (0.06 sec)`

-- 自動增長列可以插入null,讓列的值自動遞增
mysql> insert into stu25 values (null,'berry');
# `Query OK, 1 row affected (0.00 sec)`

唯一鍵

  • 唯一鍵與主鍵的區別

    • 主鍵
      • 不能重複,不能為空
      • 一個表只能有一個主鍵
    • 唯一鍵
      • 不能重刻,可以為空
      • 一個表可以有多個唯一鍵
  • 關鍵字

    • unique
    • unique key

建立唯一鍵

mysql> create table stu26(
    -> id int auto_increment primary key,
    -> name varchar(20) unique  
    -> );
# `Query OK, 0 rows affected (0.05 sec)`
mysql> create table stu27(
    -> id int primary key,
    -> name varchar(20),
    -> unique(name)
    -> );
# `Query OK, 0 rows affected (0.05 sec)`

修改表新增唯一鍵

-- 將name設為唯一鍵
mysql> alter table stu28 add unique(name);  

-- 將name,addr設為唯一鍵
mysql> alter table stu28 add unique(name),add unique(addr);
# `Query OK, 0 rows affected (0.00 sec)`
# `Records: 0  Duplicates: 0  Warnings: 0`

mysql> desc stu28;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
| addr  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
# `3 rows in set (0.02 sec)`

檢視唯一鍵的名

mysql> show create table stu28\G;  

通過唯一鍵的名字刪除唯一鍵

mysql> alter table stu28 drop index name;
# `Query OK, 0 rows affected (0.00 sec)`
# `Records: 0  Duplicates: 0  Warnings: 0`

備註

  • 備註
    • 說明性文字
    • 備註屬於SQL程式碼的一部分
    • 通過關鍵字comment設定
mysql> create table stu29(
    -> id int primary key comment '學號',
    -> name varchar(20) not null comment '姓名'
    -> );
# `Query OK, 0 rows affected (0.03 sec)`