创建数据表

创建表的语法形式

1.创建之前,指定数据库名。use <数据库名>; 2.create table时,要注意一下几点:

  • 要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如drop、alter、insert等。
  • 数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。
  1. mysql> create table tb_emp1
  2. -> (
  3. -> id int(11),
  4. -> name varchar(25),
  5. -> deptid int(11),
  6. -> salary float
  7. -> );
  8. Query OK, 0 rows affected (0.06 sec)

使用主键约束

主键又称主码,是表中一列或多列的组合。主键约束(primary key constraint)要求主键列的数据唯一,并且不允许为空。 主键分为两种类型:单字段主键和多字段联合主键。

  • 单字段主键

    语法:字段名 数据类型 primary key

mysql> create table tb_emp2 ( id int(11) primary key, name varchar(25), deptid int(11), salary float );
Query OK, 0 rows affected (0.05 sec)

在定义完所有列之后指定主键

mysql> create table tb_emp3 ( id int(11) , name varchar(25), deptid int(11), salary float,primary key(id) );
Query OK, 0 rows affected (0.05 sec)
  • 多字段联合主键

    语法:primary key [字段1,字段2,字段3………]

mysql> create table tb_emp4 ( id int(11) , name varchar(25), deptid int(11), salary float,primary key(id,name) );
Query OK, 0 rows affected (0.02 sec)

使用外键约束

外键用来在两个表的数据之间建立链接,它可以是一列或者多列。 一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某一个值。 创建外键语法:constraint 外键名 foreign key (字段1,[字段2]……)references 主表名(主键列1,[主键2]……);

--注意点:子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配。
--父表:
create table tb_dept1
(
  id int(11) primary key,
  name varchar(22) not null,
  location varchar(50)
);

--子表:
create table tb_emp5
(
  id int(11) primary key,
  name varchar(25),
  deptid int(11),
  salary float,
  constraint fk_emp_dept1 foreign key(deptid) references tb_dept1(id)
);

使用非空约束

非空约束指字段的值不能为空,对于使用了非空约束的字段,如用户在添加数据时没有指定值,数据库系统会报错。 语法:字段名 数据类型 not null

使用唯一性约束

唯一性约束要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复。 语法:字段名 数据类型 unique 或 constraint 唯一键名称 unique(字段名)

使用默认约束

默认约束(default constraint)指定某列的默认值。 语法:字段名 数据类型 default 默认值

设置表的属性值自动增加

插入新纪录时,系统自动生成字段的主键值。可以通过表主键添加auto_increment关键字来实现。默认的,在mysql中auto_increment的初始值是1,每新增一条记录,字段值自动加1。一个表只能有一个字段使用auto_increment约束,且该字段必须为主键的一部分。auto_increment可以是任何整数类型(tinyint、smallin、int、bigint等) 语法:字段名 数据类型 auto_increment ```sql create table tb_emp8 ( id int(11) primary key auto_increment, name varchar(25) not null, deptid int(11), salary float );

—插入数据(这种语法并不是SQL标准语法,不一定被其他数据库支持) insert into tb_emp8(name,salary) values(‘Lucy’,1000),(‘Lura’,1200),(‘Kevin’,1500);

<a name="NMcZ7"></a>
## 查看数据表结构
<a name="zames"></a>
### 查看表基本结构语法
> 语法: describe 表名;
> 或者简写为: desc 表名;

![图片.png](https://cdn.nlark.com/yuque/0/2020/png/396737/1587113820025-77734b86-a506-4579-8454-728ade1e2b27.png#align=left&display=inline&height=137&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=137&originWidth=459&size=4928&status=done&style=stroke&width=459)<br />其中,各个字段的含义分别解释如下:

- NULL:表示该列是否可以存储NULL值。
- key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
- default:表示该列是否有默认值。
- extra:表示可以获取的与给定列有关的附加信息。例如auto_increment等。

<a name="PNpkW"></a>
### 查看表详细结构语句 show create table
> 语法: show create table 表名\G
> - 注意:用分号,显示信息混乱,**用\G,显示信息更加直观,易于查看。**


<a name="f9pLi"></a>
## 修改表
<a name="bByg1"></a>
### 修改表名
> MySQL是通过alter table语句来实现表名的修改的,具体语法:
> alter  table <旧表名> rename [to 可选] <新表名>;
> alter table tb_dept3 renme tb_deptment3;


<a name="oizfy"></a>
### 修改字段的数据类型
> 语法:alter table <表名> modify  <字段名>  <数据类型>
> alter table tb_dept3 modify name varchar(30);


<a name="bM5AP"></a>
### 修改字段名
> 语法:alter table <表名> change/modify  <旧字段名>  <新字段名>  <新数据类型>;
> - **注意点**:由于不同类型的数据在机器中存储的方式及长度并不相同,修改数据可能会影响到数据表中已有的数据记录。不要轻易修改数据类型。


<a name="xps1X"></a>
### 添加字段
> 语法:alter table <表名>  add  <新字段名>  <数据类型>;


<a name="wi4xh"></a>
#### 添加约束和新字段的顺序
> [约束条件] {first | after 已存在字段名};

   - 添加无完整性约束条件的字段

alter table tb_dept1 add managerid int(10);

   - 添加有完整性约束条件的字段

alter table tb_dept1 add column1 int(10) not null;

   - 在表的第一列添加一个字段

alter table tb_dept1 add column2 int(10) first;

   - 在表的指定列之后添加一个字段

alter table tb_dept1 add column3  int(10) after managerid ;

<a name="iZc2A"></a>
### 删除字段
> 语法:alter table <表名>  drop <字段名>;

```sql
mysql> alter table tb_dept1 drop column2;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

修改字段的排列位置

alter table <表名> modify <字段1> <字段类型> first|after <字段2>;

更改表的存储引擎

存储引擎是MySQL中的数据存储在文件或者内存中时采用的不同技术实现。可以根据自己的需要,选择不同的引擎,甚至可以为每一张表选择不同的存储引擎。 MySQL中主要有的存储引擎有:MyISAM、InnoDB、MEMORY、BDB、FEDERATED等。

  • show engines;—查看系统支持的存储引擎。

更改表的存储引擎的语法格式如下: alter table <表名> engine=<更改后的存储引擎名>;

mysql> alter table tb_emp2  engine=MyISAM;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table tb_emp2;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                   |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp2 | CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptid` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

删除表的外键约束

语法格式: alter table <表名> drop foreign key <外键约束名>; 外键约束名指在定义时constraint关键字后面的参数。

删除数据表

删除没有被关联的表

在MySQL中,使用drop table 可以一次删除一个或多个没有被其他表关联的数据表。 语法格式如下: drop table [if exists] 表1,表2,……表n;

删除被其他表关联的主表

  • 数据表之间存在外键关联,如果直接删除父表,会显示失败。原因是直接删除,将破坏表的参照完整性。如果必要删除,可以先删除与它关联的子表,在删除父表,只是这样同时删除了两个表中的数据。
  • 但有种情况可能要保留子表,这是要单独删除父表,只需将关联的表的外键约束条件取消,然后就可以删除父表
mysql> show create table tb_emp5 \G
*************************** 1. row ***************************
       Table: tb_emp5
Create Table: CREATE TABLE `tb_emp5` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptid` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp_dept1` (`deptid`),
  CONSTRAINT `fk_emp_dept1` FOREIGN KEY (`deptid`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

mysql> alter table tb_emp5 drop foreign key fk_emp_dept1;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table tb_emp5 \G
*************************** 1. row ***************************
       Table: tb_emp5
Create Table: CREATE TABLE `tb_emp5` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptid` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp_dept1` (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> drop table tb_dept1;
Query OK, 0 rows affected (0.02 sec)