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