创建数据表
创建表的语法形式
1.创建之前,指定数据库名。use <数据库名>; 2.create table时,要注意一下几点:
- 要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如drop、alter、insert等。
- 数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。
mysql> create table tb_emp1-> (-> id int(11),-> name varchar(25),-> deptid int(11),-> salary float-> );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 表名;
<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)
