1. 程式人生 > >mysql表操作2

mysql表操作2

有用 engine ica 個學生 sig const 北京工業 service rec

完整性約束

介紹

  • 約束條件與數據類型的寬度一樣,都是可選參數;
  • 作用:用於保證數據的完整性和一致性;
  • 主要分類:

    PRIMARY KEY (PK)    標識該字段為該表的主鍵,可以唯一的標識記錄
    FOREIGN KEY (FK)    標識該字段為該表的外鍵
    NOT NULL    標識該字段不能為空
    UNIQUE KEY (UK)    標識該字段的值是唯一的
    AUTO_INCREMENT    標識該字段的值自動增長(整數類型,而且為主鍵)
    DEFAULT    為該字段設置默認值
    UNSIGNED 無符號
    ZEROFILL 使用0填充
  • 補充說明:

    1. 是否允許為空,默認NULL,可設置NOT NULL,字段不允許為空,必須賦值
    2. 字段是否有默認值,缺省的默認值是NULL,如果插入記錄時不給字段賦值,此字段使用默認值:
    `sex enum(‘male‘,‘female‘) not null default ‘male‘`
    `age int unsigned NOT NULL default 20` 必須為正值(無符號) 不允許為空 默認是20
    3. 是否是key
    主鍵 primary key
    外鍵 foreign key
    索引 (index,unique...)

not null 和default

是否可空,null表示空,非字符串
not null - 不可空
null - 可空

unique約束(唯一性約束)

  • 單列唯一

    -----1.單列唯一---------
    create table t2(
    id int not null unique,
    name char(10)
    );
    insert into t2 values(1,‘egon‘);
    insert into t2 values(1,‘alex‘);
    #上面創建表的時候把id設置了唯一約束。那麽在插入id=1,就會出錯了

primary key

primary key字段的值不為空且唯一
一個表中可以:
        單列做主鍵
        多列做主鍵(復合主鍵)
但一個表內只能有一個主鍵primary key
  • 單列主鍵

    ============單列做主鍵===============
        #方法一:not null+unique
        create table department1(
        id int not null unique, #主鍵
        name varchar(20) not null unique,
        comment varchar(100)
        );
    
        mysql> desc department1;
        +---------+--------------+------+-----+---------+-------+
        | Field   |
    Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | UNI | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ rows in set (0.01 sec) #方法二:在某一個字段後用primary key create table department2( id int primary key, #主鍵 name varchar(20), comment varchar(100) ); mysql> desc department2; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ rows in set (0.00 sec) #方法三:在所有字段後單獨定義primary key create table department3( id int, name varchar(20), comment varchar(100), constraint pk_name primary key(id); #創建主鍵並為其命名pk_name mysql> desc department3; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ rows in set (0.01 sec) 單列主鍵
  • 多列主鍵

    ==================多列做主鍵================
    create table service(
    ip varchar(15),
    port char(5),
    service_name varchar(10) not null,
    primary key(ip,port)
    );


    mysql> desc service;
    +--------------+-------------+------+-----+---------+-------+
    | Field        | Type        | Null | Key | Default | Extra |
    +--------------+-------------+------+-----+---------+-------+
    | ip           | varchar(15) | NO   | PRI | NULL    |       |
    | port         | char(5)     | NO   | PRI | NULL    |       |
    | service_name | varchar(10) | NO   |     | NULL    |       |
    +--------------+-------------+------+-----+---------+-------+
    rows in set (0.00 sec)

    mysql> insert into service values
        -> (‘172.16.45.10‘,‘3306‘,‘mysqld‘),
        -> (‘172.16.45.11‘,‘3306‘,‘mariadb‘)
        -> ;
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0

    mysql> insert into service values (‘172.16.45.10‘,‘3306‘,‘nginx‘);
    ERROR 1062 (23000): Duplicate entry ‘172.16.45.10-3306‘ for key ‘PRIMARY‘

auto_increment

  • 約束字段為自動增長,被約束的字段必須同時被key約束
#不指定id,則自動增長
create table student(
id int primary key auto_increment,
name varchar(20),
sex enum(‘male‘,‘female‘) default ‘male‘
);

mysql> desc student;
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type                  | Null | Key | Default | Extra          |
+-------+-----------------------+------+-----+---------+----------------+
| id    | int(11)               | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20)           | YES  |     | NULL    |                |
| sex   | enum(‘male‘,‘female‘) | YES  |     | male    |                |
+-------+-----------------------+------+-----+---------+----------------+
mysql> insert into student(name) values
    -> (‘egon‘),
    -> (‘alex‘)
    -> ;

mysql> select * from student;
+----+------+------+
| id | name | sex  |
+----+------+------+
|  1 | egon | male |
|  2 | alex | male |
+----+------+------+


#也可以指定id
mysql> insert into student values(4,‘asb‘,‘female‘);
Query OK, 1 row affected (0.00 sec)

mysql> insert into student values(7,‘wsb‘,‘female‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+----+------+--------+
| id | name | sex    |
+----+------+--------+
|  1 | egon | male   |
|  2 | alex | male   |
|  4 | asb  | female |
|  7 | wsb  | female |
+----+------+--------+


#對於自增的字段,在用delete刪除後,再插入值,該字段仍按照刪除前的位置繼續增長
mysql> delete from student;
Query OK, 4 rows affected (0.00 sec)

mysql> select * from student;
Empty set (0.00 sec)

mysql> insert into student(name) values(‘ysb‘);
mysql> select * from student;
+----+------+------+
| id | name | sex  |
+----+------+------+
|  8 | ysb  | male |
+----+------+------+

#應該用truncate清空表,比起delete一條一條地刪除記錄,truncate是直接清空表,在刪除大表時用它
mysql> truncate student;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into student(name) values(‘egon‘);
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+----+------+------+
| id | name | sex  |
+----+------+------+
|  1 | egon | male |
+----+------+------+
row in set (0.00 sec)

foreign key

員工信息表有三個字段:工號  姓名  部門
公司有3個部門,但是有1個億的員工,那意味著部門這個字段需要重復存儲,部門名字越長,越浪費

解決方法:

我們完全可以定義一個部門表

然後讓員工信息表關聯該表,如何關聯,即foreign key
  • 實例代碼
#表類型必須是innodb存儲引擎,且被關聯的字段,即references指定的另外一個表的字段,必須保證唯一
create table department(
id int primary key,
name varchar(20) not null
)engine=innodb;

#dpt_id外鍵,關聯父表(department主鍵id),同步更新,同步刪除
create table employee(
id int primary key,
name varchar(20) not null,
dpt_id int,
constraint fk_name foreign key(dpt_id)
references department(id)
on delete cascade
on update cascade 
)engine=innodb;

#先往父表department中插入記錄
insert into department values
(1,‘歐德博愛技術有限事業部‘),
(2,‘艾利克斯人力資源部‘),
(3,‘銷售部‘);

#再往子表employee中插入記錄
insert into employee values
(1,‘egon‘,1),
(2,‘alex1‘,2),
(3,‘alex2‘,2),

#刪父表department,子表employee中對應的記錄跟著刪
mysql> delete from department where id=3;
mysql> select * from employee;
+----+-------+--------+
| id | name  | dpt_id |
+----+-------+--------+
|  1 | egon  |      1 |
|  2 | alex1 |      2 |
|  3 | alex2 |      2 |
|  4 | alex3 |      2 |
+----+-------+--------+


#更新父表department,子表employee中對應的記錄跟著改
mysql> update department set id=22222 where id=2;
mysql> select * from employee;
+----+-------+--------+
| id | name  | dpt_id |
+----+-------+--------+
|  1 | egon  |      1 |
|  3 | alex2 |  22222 |
|  4 | alex3 |  22222 |
|  5 | alex1 |  22222 |
+----+-------+--------+

建立表之間的關系

一對多或稱為多對一
三張表:出版社,作者信息,書

一對多(或多對一):一個出版社可以出版多本書

關聯方式:foreign key
  • 一對多關系

    =====================多對一=====================
    create table press(
    id int primary key auto_increment,
    name varchar(20)
    );
    
    create table book(
    id int primary key auto_increment,
    name varchar(20),
    press_id int not null,
    foreign key(press_id) references press(id)
    on delete cascade
    on update cascade
    );
    
    
    insert into press(name) values
    (‘北京工業地雷出版社‘),
    (‘人民音樂不好聽出版社‘),
    (‘知識產權沒有用出版社‘)
    ;
    
    insert into book(name,press_id) values
    (‘九陽神功‘,1),
    (‘九陰真經‘,2),
    (‘九陰白骨爪‘,2),
    (‘獨孤九劍‘,3),
    (‘降龍十巴掌‘,2),
    (‘葵花寶典‘,3)
    ;
  • 多對多關系

    三張表:出版社,作者信息,書

    多對多:一個作者可以寫多本書,一本書也可以有多個作者,雙向的一對多,即多對多

    關聯方式:foreign key+一張新的表

    =====================多對多=====================
    create table author(
    id int primary key auto_increment,
    name varchar(20)
    );
    
    
    #這張表就存放作者表與書表的關系,即查詢二者的關系查這表就可以了
    create table author2book(
    id int not null unique auto_increment,
    author_id int not null,
    book_id int not null,
    constraint fk_author foreign key(author_id) references author(id)
    on delete cascade
    on update cascade,
    constraint fk_book foreign key(book_id) references book(id)
    on delete cascade
    on update cascade,
    primary key(author_id,book_id)
    );
    
    
    #插入四個作者,id依次排開
    insert into author(name) values(‘egon‘),(‘alex‘),(‘yuanhao‘),(‘wpq‘);
    
    #每個作者與自己的代表作如下
    egon: 
    九陽神功
    九陰真經
    九陰白骨爪
    獨孤九劍
    降龍十巴掌
    葵花寶典
    alex: 
    九陽神功
    葵花寶典
    yuanhao:
    獨孤九劍
    降龍十巴掌
    葵花寶典
    wpq:
    九陽神功
    
    
    insert into author2book(author_id,book_id) values
    (1,1),
    (1,2),
    (1,3),
    (1,4),
    (1,5),
    (1,6),
    (2,1),
    (2,6),
    (3,4),
    (3,5),
    (3,6),
    (4,1)
    ;
  • 一一對應的關系

#一定是student來foreign key表customer,這樣就保證了:
#1 學生一定是一個客戶,
#2 客戶不一定是學生,但有可能成為一個學生


create table customer(
id int primary key auto_increment,
name varchar(20) not null,
qq varchar(10) not null,
phone char(16) not null
);


create table student(
id int primary key auto_increment,
class_name varchar(20) not null,
customer_id int unique, #該字段一定要是唯一的
foreign key(customer_id) references customer(id) #外鍵的字段一定要保證unique
on delete cascade
on update cascade
);


#增加客戶
insert into customer(name,qq,phone) values
(‘李飛機‘,‘31811231‘,13811341220),
(‘王大炮‘,‘123123123‘,15213146809),
(‘守榴彈‘,‘283818181‘,1867141331),
(‘吳坦克‘,‘283818181‘,1851143312),
(‘贏火箭‘,‘888818181‘,1861243314),
(‘戰地雷‘,‘112312312‘,18811431230)
;


#增加學生
insert into student(class_name,customer_id) values
(‘脫產3班‘,3),
(‘周末19期‘,4),
(‘周末19期‘,5)
;

修改表

語法:
1. 修改表名
      ALTER TABLE 表名 
                          RENAME 新表名;

2. 增加字段
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…],
                          ADD 字段名  數據類型 [完整性約束條件…];
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…]  FIRST;
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…]  AFTER 字段名;
                            
3. 刪除字段
      ALTER TABLE 表名 
                          DROP 字段名;

4. 修改字段
      ALTER TABLE 表名 
                          MODIFY  字段名 數據類型 [完整性約束條件…];
      ALTER TABLE 表名 
                          CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];
      ALTER TABLE 表名 
                          CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];

mysql表操作2