1. 程式人生 > 其它 >四十六、MySQL資料庫3

四十六、MySQL資料庫3

今日內容概要

  • 約束條件
    • default預設值
    • unique唯一
    • primary key 主鍵
    • auto_increment自增
    • 總結
  • 表與表之間建關係
    • 外來鍵
    • 表關係
    • 一對多關係
    • 多對多關係
    • 一對一關係
    • 總結
  • 修改表
  • 複製表

今日內容詳細

  約束條件

    default預設值

"""
# 補充知識點,插入資料的時候,可以指定欄位順序
create table t1(
    id int,
    name char(16)
);

insert into t1(name,id) values('jason',1);


create table t2(
    id int,
    name char(16) not null,
    gender enum('male','female','others') default 'male'
);

mysql> desc t2;
+--------+-------------------------------+------+-----+---------+-------+
| Field  | Type                          | Null | Key | Default | Extra |
+--------+-------------------------------+------+-----+---------+-------+
| id     | int(11)                       | YES  |     | NULL    |       |
| name   | char(16)                      | NO   |     | NULL    |       |
| gender | enum('male','female','other') | YES  |     | male    |       |
+--------+-------------------------------+------+-----+---------+-------+
3 rows in set (0.05 sec)


insert into t2(id,name) values(1,'jason');
insert into t2 values(2,'egon','female');
mysql> select * from t2;
+------+------------------+--------+
| id   | name             | gender |
+------+------------------+--------+
|    1 | jason            | male   |
|    2 | egon             | female |
+------+------------------+--------+
2 rows in set (0.00 sec)



"""

    unique唯一      

"""
# 單列唯一
create table t3(
    id int unique,
    name char(16)
);

insert into t3 values(1,'jason'),(1,'egon');
insert into t3 values(1,'jason'),(2,'egon');

mysql> desc t3;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  | UNI | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.05 sec)

mysql> insert into t3 values(1,'jason'),(1,'egon');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'


# 聯合唯一
ip 和 port 
單個都可以重複,但是加在一起必須唯一
id     ip    port
1       1     1
2       1     2
3       2     1
4       3     1

create table t4(
    id int,
    ip char(16),
    port int,
    unique(ip,port)
);

mysql> desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| ip    | char(16) | YES  | MUL | NULL    |       |
| port  | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.05 sec)

insert into t4 values(1,'127.0.0.1',8080);
insert into t4 values(2,'127.0.0.1',8081);
insert into t4 values(3,'127.0.0.2',8080);

mysql> insert into t4 values(3,'127.0.0.2',8080);
Query OK, 1 row affected (0.05 sec)
前面三條執行成功

insert into t4 values(4,'127.0.0.1',8080);
mysql> insert into t4 values(4,'127.0.0.1',8080);
ERROR 1062 (23000): Duplicate entry '127.0.0.1       -8080' for key 'ip'

"""

    primary key唯一

"""
# 1.單單從約束效果上來看 primary key  等價於  not null + unique
非空且唯一!!!!

create table t5(id int primary key);
    
mysql> desc t5;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.04 sec)

insert into t5 values(null);

mysql> insert into t5 values(null);
ERROR 1048 (23000): Column 'id' cannot be null


insert into t5 values(1),(2);
insert into t5 values(3),(3);
mysql> insert into t5 values(3),(3);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

#2.它除了有約束效果之外,還是儲存引擎Innodb儲存引擎組織資料的依據
Innodb 儲存引擎規定在建立表的時候,必須要有primary key
因為它類似於數的目錄,能夠幫助提升查詢效率,並且也是建表的依據

   2.1一張表中有且只能有一個主鍵,如果你沒有設定主鍵,那麼會從上往下搜尋知道遇到一個非空且唯一的欄位將它主動升為主鍵
create table t6(
    id int,
    name char(16),
    age int not null unique,
    addr char(32) not null unique
);

mysql> desc t6;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
| age   | int(11)  | NO   | PRI | NULL    |       |
| addr  | char(32) | NO   | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.06 sec)

    2.2 如果表中既沒有設定主鍵也沒有其他任何非空且唯一的欄位,那麼Innodb會採用自己內部提供的一個隱藏欄位作為主鍵,隱藏意味著你無法使用它,就無法提升查詢速度

    2.3 一張表中通常都應該有一個主鍵欄位,並且通常將id/uid/sid欄位作為主鍵

#單個欄位主鍵
create table t5(
    id int primary key,
    name char(16)
);    

#聯合主鍵(多個欄位聯合起來作為表的主鍵,本質還是一個主鍵)

create table t7(
    id int,
    ip char(16),
    port int,
    primary key(ip,port)
);

mysql> desc t7;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| ip    | char(16) | NO   | PRI | NULL    |       |
| port  | int(11)  | NO   | PRI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

也就意味著,以後我們在建立表的時候,id欄位一定要加primary key
"""