1. 程式人生 > >mysql資料庫基礎(2)索引、主鍵、複合主鍵、外來鍵

mysql資料庫基礎(2)索引、主鍵、複合主鍵、外來鍵

增、刪、改、查

加“”表示為普通字元

mysql> insert into  t9 values("NULL",21,"game,flim");

+++++++++++++++++++++++++++++++

新增新欄位

mysql> alter table  t4 add age int(2) default 19;        //預設在最後面

mysql> alter table  t4 add mail char(50) after name;   //加在name後面

mysql> alter table  t4 add stu_num char(10) first;      //加在最前面

 

修改欄位型別 ,型別要與欄位儲存的資料匹配,不能有衝突.

mysql> alter table  t4 modify name varchar(3);

ERROR 1406 (22001): Data too long for column 'name' at row 1

 

mysql> alter table  t4 modify name varchar(15);

Query OK, 1 row affected (0.44 sec)

 

修改欄位位置

mysql> alter table  t4  modify age int(2) default  19

after name;

 

刪除欄位

mysql> alter table  t5 drop start;

mysql> select  * from t5;

mysql> desc  t5;

 

修改欄位名

alter table  t4 change stu_num stu_id char(10);

 

修改表名

alter table   t9 rename stuinfo;

 

應用

mysql> create table t7(meeting datetime,party timestamp);

                                             不自動賦值      會自動賦值當前時間

mysql> insert into t7 values(now(),now());

Query OK, 1 row affected (0.07 sec)

 

mysql> select * from t7;

+---------------------+---------------------+

| meeting             | party               |

+---------------------+---------------------+

| 2018-10-16 09:31:50 | 2018-10-16 09:31:50 |

+---------------------+---------------------+

 

mysql> insert into t7(meeting) values(now());

 

mysql> select * from t7;

+---------------------+---------------------+

| meeting             | party               |

+---------------------+---------------------+

| 2018-10-16 09:31:50 | 2018-10-16 09:31:50 |

| 2018-10-16 09:33:12 | 2018-10-16 09:33:12 |

+---------------------+---------------------+

 

 

mysql> select * from t7;

+---------------------+---------------------+

| meeting             | party               |

+---------------------+---------------------+

| 2018-10-16 09:31:50 | 2018-10-16 09:31:50 |

| 2018-10-16 09:33:12 | 2018-10-16 09:33:12 |

| 2018-10-17 08:25:00 | 2018-10-16 09:34:01 |

| NULL                | 2018-10-17 08:25:00 |

+---------------------+---------------------+

 

 

mysql> desc teadb.t5;

+----------+----------+------+-----+---------+-------+

| Field    | Type     | Null | Key | Default | Extra |

+----------+----------+------+-----+---------+-------+

| name     | char(10) | YES  |     | NULL    |       |

| birthday | date     | YES  |     | NULL    |       |

| start    | year(4)  | YES  |     | NULL    |       |

| uptime   | time     | YES  |     | NULL    |       |

| party    | datetime | YES  |     | NULL    |       |

+----------+----------+------+-----+---------+-------+

 

 

mysql> insert into t5(name,start) values("tom",50);

 

mysql> select * from t5;

+------+------------+-------+----------+---------------------+

| name | birthday   | start | uptime   | party               |

+------+------------+-------+----------+---------------------+

| bob  | 1993-07-02 |  1993 | 08:30:00 | 2018-10-15 20:30:00 |

| tom  | NULL       |  2050 | NULL     | NULL                |

+------+------------+-------+----------+---------------------+

//year預設為4位數,1-69--->20   70-99--->19

 

 

mysql> create table t88(name char(3),level int(3) zerofill);    //顯示寬度,0補足位

Query OK, 0 rows affected (0.25 sec)

 

mysql> insert into t88 values("tom",1131);

mysql> insert into t88 values("tom",113);

mysql> insert into t88 values("tom",11);

mysql> insert into t88 values("tom",3);

 

mysql> select * from t88;

+------+-------+

| name | level |

+------+-------+

| tom  |  1131 |

| tom  |   113 |

| tom  |   011 |

| tom  |   003 |

+------+-------+

 

 

 

 

 

mysql> create table t9(name char(10) not null,age tinyint(2) default 19,likes set("eat","sleep","film","game") not null default "game,eat");

//no null:不能為空值 ,預設可以為空   //detault:預設值

mysql> insert into t9(name) values("bob");

Query OK, 1 row affected (0.02 sec)

 

mysql> select * from t9;

+---------+---------+----------------+

| name | age  |    likes   |

+---------+---------+----------------+

| bob  |   19 | game,eat  |

+---------+---------+----------------+

 

 

mysql> desc t9;

+-------+-------------------------------------------------------+-------+-----+------------+--------+

| Field | Type                             | Null | Key | Default | Extra |

+-------+-------------------------------------------------------+------+------+------------+-------+

| name | char(10)                          | NO |   | NULL   |     |

| age  | tinyint(2)                         | YES |   | 19     |     |

| likes  | set('eat','sleep','film','game')         | NO |   | game  |     |

+-------+-------------------------------------------------------+------+-----+-----------+---------+

//不輸入會預設補內容

 

 

新增欄位 預設在最後

mysql> alter table t4 add nanjing int(2) default 22;

 

mysql> select * from t4;

+--------+------+------+------+---------+---------+

| stu_id | name | age  | mail | homedir | nanjing |

+--------+------+------+------+---------+---------+

| NULL   | jack |   19 | NULL | USA     |      22 |

| NULL   | lll  |   19 | NULL | han     |      22 |

+--------+------+------+------+---------+---------+

 

 

索引

索引是指給欄位排隊,類似書的目錄

優點:可以加快查詢資料速度

缺點:減慢寫入的速度,增加減少都需要重新排列。排隊資訊需要檔案來儲存,佔記憶體

平時我們看不到排序,查詢時直接會提示資料在幾行。

建立表的時候新增索引:  //可同時新增多個索引

mysql> create table t12( name char(10),class char(7),age int(2) , index(name),index(class));

 

mysql> desc t12;

+-------+----------+------+-----+---------+-------+

| Field | Type     | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| name  | char(10) | YES  | MUL | NULL    |       |

| class | char(7)  | YES  | MUL | NULL    |       |

| age   | int(2)   | YES  |     | NULL    |       |

+-------+----------+------+-----+---------+-------+

 

 

mysql> show index from t12\G;       //檢視索引

 

mysql> drop index name on t12;         //刪除索引

mysql> desc t12;

+-------+----------+------+-----+---------+-------+

| Field | Type     | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| name  | char(10) | YES  |     | NULL    |       |

| class | char(7)  | YES  | MUL | NULL    |       |

| age   | int(2)   | YES  |     | NULL    |       |

+-------+----------+------+-----+---------+-------+

 

mysql> create index name on t12(name);    //在已有的表裡新增索引,索引名與表名一致

mysql> desc t12;

+-------+----------+------+-----+---------+-------+

| Field | Type     | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| name  | char(10) | YES  | MUL | NULL    |       |

| class | char(7)  | YES  | MUL | NULL    |       |

| age   | int(2)   | YES  |     | NULL    |       |

+-------+----------+------+-----+---------+-------+

 

建立主鍵的格式1

mysql> create table t22(name char(10),stu_num char(9),primary key(stu_num));

建立主鍵的格式2(同上)

mysql> create table t23(name char(10),stu_num char(9)primary key);

+---------+----------+------+-----+---------+-------+

| Field   | Type     | Null | Key | Default | Extra |

+---------+----------+------+-----+---------+-------+

| name    | char(10) | YES  |     | NULL    |       |

| stu_num | char(9)  | NO   | PRI | NULL    |       |

+---------+----------+------+-----+---------+-------+

 

mysql> select * from t22;

+------+-----------+

| name | stu_num   |

+------+-----------+

| tom  | nsd180705 |           //設值主鍵欄位(stu_num)值不於允許重複,不能為空

+------+-----------+

 

複合主鍵(表中多個欄位一起做主鍵,表中多行設符合主鍵不能重複不能為空)

mysql> create table t24(cip char(15),sport smallint(2),status enum("deny","all"),primary key(cip,sport));

mysql> select * from t24;

+-------------+-------+--------+

| cip         | sport | status |

+-------------+-------+--------+

| 192.168.4.1 |    21 | deny   |

| 192.168.4.1 |    22 | deny   |

| 192.168.4.2 |    22 | deny   |

| 192.168.4.3 |    22 | all    |

+-------------+-------+--------+

 

刪除主鍵,不刪除內容,還是不能為空,表將不受約束

mysql> alter table t24 drop primary key;               //刪除

 

在已有表裡建立複合主建(如果表中有重複的資料不能建立,需要先改表)

mysql> alter table t24 add primary key(cip,sport);      //建立

 

主鍵+自增長(自己存亦遵循約束規則//空值,重複)//自增長從最大的開始

//刪除也從歷史最大值開始記錄

mysql> create table t25(stu_id int primary key auto_increment,name char(5),age tinyint(2) unsigned);                                   自加1

 

mysql> desc t25;

+--------+---------------------+------+-----+---------+----------------+

| Field  | Type                | Null | Key | Default | Extra          |

+--------+---------------------+------+-----+---------+----------------+

| stu_id | int(11)             | NO   | PRI | NULL    | auto_increment |

| name   | char(5)             | YES  |     | NULL    |                |

| age    | tinyint(2) unsigned | YES  |     | NULL    |                |

+--------+---------------------+------+-----+---------+----------------+

 

mysql> insert into t25(name,age)values("bob",19);

mysql> insert into t25(name,age)values("tom",18);

 

mysql> select * from t25;

+--------+------+------+

| stu_id | name | age  |

+--------+------+------+

|      1 | bob  |   19 |

|      2 | tom  |   18 |                   //自加一

+--------+------+------+

 

mysql> alter table t88 add id int(2) zerofill primary key auto_increment first;

 

mysql> select * from t88;

+----+------+-------+

| id | name | level |

+----+------+-------+

| 01 | tom  |  1131 |

| 02 | tom  |   113 |

| 03 | tom  |   011 |

| 04 | tom  |   003 |

+----+------+-------+

 

 

先珊自增欄位才能珊主鍵

mysql> alter table t25 modify stu_id int(2) not null;         //先刪除自增長段

mysql> desc t25;

+--------+---------------------+------+-----+---------+-------+

| Field  | Type                | Null | Key | Default | Extra |

+--------+---------------------+------+-----+---------+-------+

| stu_id | int(2)              | NO   | PRI | NULL    |       |  //原來有auto_increment

| name   | char(5)             | YES  |     | NULL    |       |

| age    | tinyint(2) unsigned | YES  |     | NULL    |       |

+--------+---------------------+------+-----+---------+-------+

mysql> alter table t25 drop primary key;              //珊主鍵

mysql> desc t25;

+--------+---------------------+------+-----+---------+-------+

| Field  | Type                | Null | Key | Default | Extra |

+--------+---------------------+------+-----+---------+-------+

| stu_id | int(2)              | NO   |     | NULL    |       |

| name   | char(5)             | YES  |     | NULL    |       |

| age    | tinyint(2) unsigned | YES  |     | NULL    |       |

+--------+---------------------+------+-----+---------+-------+

 

 

 

外來鍵

定義:讓當前表字段的值在另一個表中欄位值的範圍內選擇,保證資料的一致性。

使用外來鍵的條件:

表的儲存引擎必須是innodb

欄位型別要一致

被參照欄位必須要是索引型別的一種(primary key)

 

 

 

mysql> create table ygtab(yg_id int(2)primary key auto_increment,naem char(10)) engine=innodb;

 

mysql> insert into ygtab(naem)values("bob");

mysql> insert into ygtab(naem)values("tom");

 

mysql> create table gztab(gz_id int(2),pay float(7,2),foreign key(gz_id) references ygtab(yg_id)on update cascade on delete cascade)engine=innodb;

//regerences:引用  foreign key:外來鍵

mysql> desc gztab;

+-------+------------+------+-----+---------+-------+

| Field | Type       | Null | Key | Default | Extra |

+-------+------------+------+-----+---------+-------+

| gz_id | int(2)     | YES  | MUL | NULL    |       |

| pay   | float(7,2) | YES  |     | NULL    |       |

+-------+------------+------+-----+---------+-------+

 

 

 

準備案例:

mysql> insert into gztab values(1,28000);

mysql> insert into gztab values(2,38000);

mysql> select * from ygtab;

+-------+------+

| yg_id | naem |

+-------+------+

|     1 | bob  |

|     2 | tom  |

+-------+------+

mysql> select * from gztab;

+-------+----------+

| gz_id | pay      |

+-------+----------+

|     1 | 28000.00 |

|     2 | 38000.00 |

+-------+----------+

 

 

 

//改參考的員工表字段,自己表應該也同部更新  //單向同步

mysql> update ygtab set yg_id=8 where yg_id=2;

 

mysql> select * from gztab;

+-------+----------+

| gz_id | pay      |

+-------+----------+

|     1 | 28000.00 |

|     8 | 38000.00 |

+-------+----------+

2 rows in set (0.00 sec)

 

mysql> select * from ygtab;

+-------+------+

| yg_id | naem |

+-------+------+

|     1 | bob  |

|     8 | tom  |

+-------+------+

 

 

mysql> delete from ygtab where yg_id=8;          //刪除員工表資訊

 

mysql> select * from gztab;                     //工資表資訊自動刪除

+-------+----------+

| gz_id | pay      |

+-------+----------+

|     1 | 28000.00 |

+-------+----------+

1 row in set (0.00 sec)

//有利有弊

//有bug,gz_id 需要做主鍵不然可以連發工資,因為參考表有記錄,被參考的表無法刪除,需要先刪除外來鍵,再刪除表(主鍵還在)