数据库
查看当前所有数据库
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
创建一个新数据库
创建一个叫senpai
的数据库:
sql
mysql> create database senpai;
创建一个重名的数据库会报错。所以良好的创建数据库的习惯是先检查senpai
的存在性,如果不存在就创建,如果存在那么不进行任何操作。下面的语句就是这个功能。
sql
mysql> create database if not exists senpai;
在 Windows 下,数据库名、表名这些是不区分大小写的,即
senpai,SenPai,SENPAI
都是同一个数据库。但是 Linux 下会严格区分大小写。
切换数据库
切换到一个叫senpai
的数据库:
sql
mysql> use senpai;
切换一个不存在的数据库会报错。
删除数据库
删除一个叫senpai
的数据库。同样地,由于删除不存在的数据库会报错,建议使用下面第二条语句。
sql
mysql> drop database senpai;
mysql> drop database if exists senpai;
基本表
只有指定了具体的数据库或者模式,才能进行对表的操作。比如下面在数据库senpai
里进行表的操作,需要先use senpai;
。
定义基本表 AND 表的主码约束
最基本的情况就是对每一列进行定义,如有下面的"学生表":
列名 | 类型 |
---|---|
Sno |
char(9) |
Sname |
char(20) |
Ssex |
char(2) |
Sage |
smallint |
Sdept |
char(20) |
可以使用如下语句进行定义,基本格式是列名 + 数据类型 + 列级完整性约束条件
。
sql
create table Student(
Sno char(9) primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
完整性约束包括实体完整性 (要定义主码
primary key
),参照完整性 (可能要定义外码foreign key
),以及用户定义的完整性 (比如上面的unique
唯一性,当然还有not null
非空,unsigned
非负等)。
上面是一个属性作为主码。如果多个属性作为主码要用括号括起来,放在表级完整性约束里面(单属性主码也可以这样)。比如
sql
create table SC(
Sno char(9),
Cno int, // 到这里都是列级完整性
primary key(Sno,Cno); // 表级完整性约束
...
);
外码约束
sql
create table SC(
Sno char(9) foreign key references ,
Cno int,
...
foreign key(Sno) references Student(Sno),
foreign key(Cno) references Course(Cno)
);
其它约束
Check约束
有时候一些列的取值限定在某个范围内,或者列与列之间存在相互约束,就可以用check(约束条件)
来约束。
字段名称 | 数据类型 | 备注 |
---|---|---|
pid |
char(10) |
产品户ID,主码 |
name |
varchar(32) |
产品名称 |
brand |
char(10) |
品牌,只能是('A','B')中的某一个 |
price |
int |
价格,必须 > 0 >0 >0 |
sql
drop table if exists products;
create table products(
...,
brand char(10) [constraint CK_products_brand] check(brand in ('A','B')),
price int [constraint CK_products_price] check(price > 0)
);
中括号里是给约束加名字,可省略。
Default 约束
给属性列设置默认值。
sql
create table test(
pk int primary key,
test_col int default 114514);
只有在缺省插入值时,才会触发默认值。如果指定该列是NULL
则不会触发默认值。
sql
mysql> insert into test values(1,NULL);
mysql> insert into test (pk) values (2);
上面语句的执行结果:
mysql> select * from test;
+----+----------+
| pk | test_col |
+----+----------+
| 1 | NULL |
| 2 | 114514 |
+----+----------+
2 rows in set (0.00 sec)
Unique 约束
它和主码约束有点像,可以令某一属性列具有唯一性,也可以令多个属性列的组合具有唯一性。
sql
create table test(
pk int primary key,
col1 int unique,
col2 int
);
不能出现重复的col1
,比如插入(0,1,2),(1,1,3)
会报错。
sql
create table test(
pk int primary key,
col1 int,
col2 int,
unique(col1,col2)
);
不能出现重复的(col1,col2)
,但是col1
或者col2
本身可以重复。
sql
mysql> insert into test values(0,1,2),(1,2,1),(2,1,1),(3,2,2);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
可行,结果如下:
mysql> select * from test;
+----+------+------+
| pk | col1 | col2 |
+----+------+------+
| 2 | 1 | 1 |
| 0 | 1 | 2 |
| 1 | 2 | 1 |
| 3 | 2 | 2 |
+----+------+------+
4 rows in set (0.00 sec)
插入重复的(col1,col2) = (1,1)
后报错。
sql
mysql> insert into test values(5,1,1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'test.col1'