MySQL資料表的基本操作

Federico發表於2018-04-28

約束

主鍵約束

  主鍵,又稱主碼,是表中一列或多列的組合。主鍵約束(Primary Key Constraint)要求主鍵列的資料唯一,並且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外來鍵來定義不同資料表之間的關係,並且可以加快資料庫查詢速度。
  主鍵分為兩種型別:

  • 單欄位主鍵

    在定義列的同時指定主鍵:欄位名 資料型別 primary key
    在定義完所有列之後指定主鍵:constraint <約束名> primary key [欄位名]

  • 多欄位聯合主鍵

    多欄位聯合主鍵語法如下:primary key [欄位1,欄位2,...欄位n]

例如:primary key(id,name)

外來鍵約束

  外來鍵用來在兩個表的資料之間建立連結,它可以是一列或者多列。一個表可以有一個或者多個外來鍵。一個表的外來鍵可以為空值,若不為空值,則每一個外來鍵值必須等於另一個表中的主鍵的某個值。
  外來鍵:首先它是表中的一個欄位,它可以不是本表的主鍵,但對應另一個表的主鍵。外來鍵的作用是保持資料的一致性、完整性。
  主表:對於兩個具有關聯的表而言,相關聯欄位中主鍵所在的那個表即是主表。
  從表:對於兩個具有關聯的表而言,相關聯欄位中外來鍵所在的那個表即是從表。
建立外來鍵的語法規則如下:
constraint <外來鍵名> foreign key [欄位1,欄位2,....欄位n] references <主表名> [主鍵列1,主鍵列2,...主鍵列n]
例如:constraint test foreign key(name) references table_1(id);
從表的外來鍵必須關聯主表的主鍵,且關聯欄位的資料型別必須一致

非空約束

  非空約束指欄位的值不能為空。對於使用了非空約束的欄位,如果使用者在新增資料時未指定值,資料庫系統會報錯。
非空約束語法規則如下:
欄位名 資料型別 not null

唯一約束

  唯一性約束,要求該列唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複的值。
唯一性約束語法規則如下:

  • 定義完列之後直接指定唯一性約束

    欄位名 資料型別 unique

  • 定義完所有列之後指定唯一性約束

    constraint <約束名> unique [欄位名]
    例如:constraint test unique(id)

uniqueprimary key的區別:一個表中可以有多個欄位宣告為unique,但只能有一個primary key宣告;宣告為primary key的列不允許有空值,但宣告為unique的欄位允許空值的存在。

預設約束

  預設約束,指定某列的預設值。如男性員工比較多,性別就可以預設為“男”,如果插入一條新的記錄時沒有給這個欄位賦值,那麼系統就會自動為這個欄位賦值為“男”。
預設約束的語法規則如下:
欄位名 資料型別 default
例如:sex varchar(25) default man ;

設定表的屬性值自動增加

  在資料庫應用中,經常希望在每次插入新紀錄時,系統自動生成欄位的主鍵值。通過auto_increment,一個表只能有一個欄位使用auto_increment約束,且該欄位必須為主鍵的一部分。auto_increment約束的欄位可以是任何整數型別。
設定表的屬性值自動增加的語法規則如下:
欄位名 資料型別 auto_increment

資料表結構的操作

檢視

檢視錶基本結構語句

  describe/desc語句可以檢視錶的欄位資訊,其中包括:欄位名、欄位資料型別、是否為主鍵,是否有預設值等。
語法規則如下:
describe 表名==desc 表名
例:

mysql> describe user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(16)                          | NO   | PRI |                       |       |
| Password               | char(41)                          | NO   |     |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |

檢視錶的詳細結構

 show create table語句可以用來顯示建立表時的create table語句,語法格式如下:
show create table 表名\G;
例:

mysql> show create table user\G;
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

修改資料表

修改表名

語法規則如下:
alter table 舊錶名 rename 新表名
  修改表名不影響建立表時的資料結構。

修改欄位資料型別

語法規則如下:
alter table 表名 modify 欄位名 [資料型別]
例:
alter table test modify name varchar(30);

修改欄位名

語法規則如下:
alter table 表名 change 舊欄位名 新欄位名 [新資料型別]
例:
alter table test change name user_name varchar(30);

新增欄位

語法規則如下:
alter table 表名 add 新欄位名 [資料型別] [約束條件] [first|after 已存在欄位名] ;
例:
alter table test add id int(11) first;

在表的第一列新增一個id欄位。

alter table test add id int(11) after name;

在表的name列下新增一個id欄位。

刪除欄位

語法規則如下:
alter table 表名 drop 欄位名

修改欄位的排列位置

語法規則如下:
alter table 表名 modify 欄位1 [資料型別] first|after 欄位2;
例:
alter table test modify id varchar(12) first;

將id欄位調整到表中的第一列

alter table test modify id varchar(12) after name

將id欄位調整到表中name欄位後

更改表的儲存引擎

  可以使用show engines來檢視MySQL支援的儲存引擎。

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

更改表的儲存引擎的語法格式如下:
alter table 表名 engine=更改後的儲存引擎名
例:
alter table test engine=MyISAM;

刪除表的外來鍵約束

語法規則如下:
alter table 表名 drop foreign key 外來鍵約束名

刪除資料表

drop table [if exists] 表1,表2...,表n;
引數if exists用於在刪除前判斷刪除的表是否存在,加上改引數後,再刪除表的時候,如果表不存在,SQL語句中可以順利執行,但會發出警告。需要注意的是:當資料表中存在外來鍵關聯的情況下,直接刪除主表會顯示刪除失敗,需要先接觸外來鍵約束條件

相關文章