约束
约束用于确保数据库的数据满足特定的商业规则
在mysql中,约束包括:not null、unique、primary key、foreign、check
primary key
一张表最多只能有一个主键,但可以有复合主键
复合主键的插入要完全一样才会报错
CREATE TABLE t1
(id INT PRIMARY KEY,
`name` VARCHAR(32),
email VARCHAR(32));
not null
unique
如果没有指定not null,则 unique 字段可以有多个null
表可以有多个unique
CREATE TABLE t1
(id INT PRIMARY KEY UNIQUE NOT NULL,
`name` VARCHAR(32) UNIQUE,
email VARCHAR(32) NOT NULL );
foreign key
外键定义主表和从表之间的关系:外键约束在从表上,主表必须要有主键约束或unique约束,
当定义外键后,外键列数据必须在主表的主键列存在或是null
例子:班级表,学生表
先建主表,再建从表
CREATE TABLE my_class (
id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '');
外键约束在从表上,主表必须要有主键约束或unique约束
CREATE TABLE my_stu (
id INT PRIMARY KEY,
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT,
FOREIGN KEY (class_id) REFERENCES my_class(id));
插入的外键再主表里面必须存在
INSERT INTO my_class
VALUES
(1,'qqq'),
(2,'www'),
(3,'eee');
INSERT INTO my_stu
VALUES
(11,'ldt',1),
(12,'lds',1),
(21,'lda',2),
(22,'ldd',2),
(31,'ldf',3),
(32,'ldg',3);
1.外键指向的表的字段,要求是 primary key 或者是 unique
2.表的类型是 innodb ,这样的表才支持外键
3.外键字段的类型要和主键字段的类型一致
4.外键字段的值,必须在主键字段中出现过,或者外键是null(前提是外键字段允许会 null)
5.一但建立主外键关系,数据就不能随意删除
check
用于强制数据必须满足某些条件(数值在1000-2000内),oracle和sql server 都支持check,但mysql5.7不支持check,只做语法校验,但不会生效。
mysql8生效
CREATE TABLE my_check(
id INT PRIMARY KEY,
`name` VARCHAR(32),
sex VARCHAR(6) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK (sal>1000 AND sal<2000));
INSERT INTO my_check
VALUES(1,'lds','asd',1);
总案例:
商店的数据库shop_db,记录客户机购物情况,三个表组成
商品goods
(商品号,商品名,单价,商品类别,供应商)
客户customer
(客户号,姓名,住址,电邮,性别,身份证)
购买purchase
(订单号,客户号,商品号,购买数)
建表要求:
1.每个表的主外键
2.客户的姓名不能为 null
3.电邮不能能重复
4.性别男女
5.单价在1-9999之间
CREATE TABLE goods(
goods_id INT PRIMARY KEY,
goods_name VARCHAR(64) NOT NULL DEFAULT '',
unitprice DECIMAL(10,2) NOT NULL DEFAULT 0
CHECK (unitprice >= 1.0 AND unitprice <= 9999.99),
category INT NOT NULL DEFAULT 0,
provider VARCHAR(64) NOT NULL DEFAULT '');
CREATE TABLE customer(
customer_id CHAR(8) PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT '',
address VARCHAR(64) NOT NULL DEFAULT '',
email VARCHAR(64) UNIQUE NOT NULL,
sec ENUM('m','w') NOT NULL, -- 枚举类型
card_id CHAR(18));
CREATE TABLE purchase(
order_id INT UNSIGNED PRIMARY KEY,
customer_id CHAR(8) NOT NULL DEFAULT '', -- 外键
goods_id INT NOT NULL DEFAULT 0, -- 外键
nums INT NOT NULL DEFAULT 0,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES goods(goods_id));
DESC goods;
DESC customer;
DESC purchase;
自增长
在某张表中,存在一个id列(整数),该列从1开始,自动增加
CREATE TABLE my_temp
(id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32) NOT NULL DEFAULT '');
INSERT INTO my_temp
VALUES
(NULL,'123'),
(NULL,'234')
SELECT * FROM my_temp
细节:
1.一般自增长配和primary key使用
2.自增长也可以单独使用(不用主键,但要配合一个unique)
3.自增长修饰整数,小数也行但不会用
4.自增长默认从1开始,但可以修改开始值
5.自增长可以指定特定值,但会之后会从特定值继续,但不会这样用。