首页Mysql创建表
Created At : 2021-11-25
Last Updated: 2021-11-25

Mysql创建表

所谓创建数据表,指的是在已经创建好的数据库中建立新表。

创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。

数据表属于数据库,在创建数据表之前,应该使用语句“USE <数据库名>”指定操作是在哪个数据库中进行。

如果没有选择数据库,就会抛出 (1046, 'No database selected') 的错误。

创建表的基本语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

创建表操作演示

使用主键约束

主键,又称主码,是表中一列或多列的组合。

主键约束(Primary Ke yConstraint)要求主键列的数据唯一,并且不允许为空。

主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。

1. 定义列的同时指定主键

create  table tb2 (
	id int primary key,
	name varchar(20)
)

MySQL root@localhost:test> desc tb2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | <null>  |       |
| name  | varchar(20) | YES  |     | <null>  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set
Time: 0.044s

2. 定义完所有列后指定主键

create  table tb3 (
	id int,
	name varchar(20),
	primary key (id)
)

MySQL root@localhost:test> desc tb3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | <null>  |       |
| name  | varchar(20) | YES  |     | <null>  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set
Time: 0.003s

3. 定义多字段联合主键

对于多字段联合主键,只能在定义完所有列后指定主键,使用逗号分隔

create  table tb4 (
	id int,
	name varchar(20),
	age int,
	primary key (id,name)
)

MySQL root@localhost:test> desc tb4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | <null>  |       |
| name  | varchar(20) | NO   | PRI | <null>  |       |
| age   | int         | YES  |     | <null>  |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set
Time: 0.054s

使用外键约束

外键用来在两个表的数据之间建立连接,可以是一列或者多列。

一个表可以有一个或多个外键。

外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。

外键:首先它是表中的一个字段,虽可以不是本表的主键,但要对应另外一个表的主键。

外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。

例如:

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT,
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;

使用非空约束

非空约束(Not Null Constraint)指字段的值不能为空。

对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。

create  table tb5 (
	id int primary key,
	name varchar(20) not null
)

MySQL root@localhost:test> desc tb5;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | <null>  |       |
| name  | varchar(20) | NO   |     | <null>  |       |
+-------+-------------+------+-----+---------+-------+

使用唯一性约束

唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值

唯一约束可以确保一列或者几列不出现重复值。

create  table tb6 (
	id int primary key,
	name varchar(20) not null unique
)

MySQL root@localhost:test> DESC tb6;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | <null>  |       |
| name  | varchar(20) | NO   | UNI | <null>  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set
Time: 0.052s

使用默认约束

默认约束(Default Constraint)指定某列的默认值。

# 创建表
create  table tb7 (
	id int primary key,
	name varchar(20) not null unique,
	state int default 1
)

# 插入一条数据
MySQL root@localhost:test> insert into tb7 (id,name) values (1,'jack');
Query OK, 1 row affected
Time: 0.041s

# 查询数据,state默认值为1
MySQL root@localhost:test> select * from tb7;
+----+------+-------+
| id | name | state |
+----+------+-------+
| 1  | jack | 1     |
+----+------+-------+
1 row in set
Time: 0.003s

设置表的属性值自动增加

默认的,在MySQL中AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。

一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。

AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLIN、INT、BIGINT等)。

# 创建表
create  table tb8 (
	id int primary key auto_increment,
	name varchar(20) not null unique,
	state int default 1
)

# 插入2条数据
MySQL root@localhost:test> insert into tb8 (name) values ('jack');
MySQL root@localhost:test> insert into tb8 (name) values ('Lucy');

# 查询数据
MySQL root@localhost:test> select * from tb8;
+----+------+-------+
| id | name | state |
+----+------+-------+
| 1  | jack | 1     |
| 2  | Lucy | 1     |
+----+------+-------+
2 rows in set
Time: 0.003s

CREATE TEMPORARY TABLE

Temporary Tables,即创建临时表,只在当前会话有效。可以用户测试。

例如,之前我们安装了示例数据库world, 我们可以临时复制其city表。

# 1.查看当前的表
MySQL root@localhost:world> SHOW tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

# 2. 查询city表中数据,选择10创建临时表 new_city
MySQL root@localhost:world> CREATE TEMPORARY TABLE new_city SELECT * FROM city limit 10;
Query OK, 10 rows affected

# 3.查询new_city表的数据
MySQL root@localhost:world> SELECT * FROM new_city
+----+----------------+-------------+---------------+------------+
| ID | Name           | CountryCode | District      | Population |
+----+----------------+-------------+---------------+------------+
| 1  | Kabul          | AFG         | Kabol         | 1780000    |
| 2  | Qandahar       | AFG         | Qandahar      | 237500     |
| 3  | Herat          | AFG         | Herat         | 186800     |
| 4  | Mazar-e-Sharif | AFG         | Balkh         | 127800     |
| 5  | Amsterdam      | NLD         | Noord-Holland | 731200     |
| 6  | Rotterdam      | NLD         | Zuid-Holland  | 593321     |
| 7  | Haag           | NLD         | Zuid-Holland  | 440900     |
| 8  | Utrecht        | NLD         | Utrecht       | 234323     |
| 9  | Eindhoven      | NLD         | Noord-Brabant | 201843     |
| 10 | Tilburg        | NLD         | Noord-Brabant | 193238     |
+----+----------------+-------------+---------------+------------+

10 rows in set

# 4. 虽然创建了临时表new_city,但是 通过SHOW tables; 并不会显示此表。
MySQL root@localhost:world> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set

CREATE TABLE LIKE

Table Cloning and Copying,即表克隆和表复制。

CREATE TABLE new_tbl LIKE orig_tbl;

基于原有表创建一个空表。

MySQL root@localhost:world> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set
Time: 0.006s
MySQL root@localhost:world> CREATE TABLE empty_city LIKE city;
Query OK, 0 rows affected
Time: 0.072s
MySQL root@localhost:world> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
| empty_city      |
+-----------------+
4 rows in set
Time: 0.003s
MySQL root@localhost:world> DESC empty_city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int      | NO   | PRI | <null>  | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int      | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set
Time: 0.006s

CREATE TABLE AS SELECT

即将现有表中的列定义和列数据复制到新表中。

完整语法:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

例如:

MySQL root@localhost:world> CREATE TABLE new_city AS SELECT ID,name  FROM city;
Query OK, 4079 rows affected
Time: 0.050s
MySQL root@localhost:world> DESC new_city;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ID    | int      | NO   |     | 0       |       |
| name  | char(35) | NO   |     |         |       |
+-------+----------+------+-----+---------+-------+
2 rows in set
Time: 0.004s