sql之约束
SQL 约束
2023-09-11 14:19:18 时间
专栏目录请点击
列级约束
列级约束一般在定义列的时候就直接把约束定义上
CREATE TABLE studentinfo (
id INT PRIMARY KEY, # 主键
stuName VARCHAR(20) NOT NULL, # 非空约束
gender CHAR(1) CHECK(gender="男" OR gender="女"), # 检查
age INT DEFAULT 18, # 默认约束
majorId INT REFERENCES magor(id) # 外键
)
DESC studentinfo;
通过desc我们可以看到相关的表结构
或者使用SHOW INDEX FROM studentinfo;
来查看所有的索引,包括主键、外键、唯一值
表级约束
表级约束需要在表的所有的字段下面定义约束,语法如下
[CONSTRAINT 约束名] 约束类型(字段名)
如上的表格,可以也可以用一下定义
CREATE TABLE studentinfo (
id INT, # 主键
stuName VARCHAR(20), # 非空约束
gender CHAR(1) , # 检查
age INT DEFAULT 18, # 默认约束
majorId INT # 外键
CONSTRAINT pk PRIMARY KEY(id), # 主键
CONSTRAINT uq UNIQUE(stuName), # 唯一
CONSTRAINT ck CHECK(gender="男" OR gender="女") # 检查
CONSTRAINT fk_student_major FOREIGN KEY(majorId) REFERENCES major(id) # 外键
)
主键与唯一键
类型 | 保证唯一性 | 是否允许为空 | 数量 | 是否允许组合 |
---|---|---|---|---|
主键 | ✔ | ✖ | 最多有一个 | 可以,但不推荐 |
唯一键 | ✔ | ✖ | 可以有多个 | 可以,但不推荐 |
外键
- 在从表中设置外键关系
- 从表的外键列的类型和主表的关联列额类型要求一致或者兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键或者唯一)
- 插入数据的时候要先插入主表在插入从表,删除数据的时候,要先删除从表,在删除主表
标识列
标识列又称自增长列,可以不用手动插入值,系统提供默认的序列值
特点
- 标识列不一定和主键搭配,但是要求是一个key
- 一个表最多有一个标识列
- 标识列的类型只能是数值
- 标识列可以通过
SET auto_increment_incremenet=2;
来设置步长
创建表时
在创建表的时候设置标识列
CREATE TABLE studentinfo (
id INT PRIMARY KEY AUTO_INCREMENT, # 主键
// ...
)
修改表时
修改
ALTER TABLE studentinfo MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
删除
也相当于修改列
ALTER TABLE studentinfo MODIFY COLUMN id INT PRIMARY KEY;
约束的增删
修改表时添加
- 添加主键约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name)
CONSTRAINT
是可以添加,也可以不添加。如果添加的话,表示为约束起名字的意思。
ALTER TABLE user2 ADD CONSTRAINT pk_user2_id PRIMARY KEY(id);
- 添加唯一约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type](index_col_name,…)
ALTER TABLE user2 ADD UNIQUE(username);
- 添加外键约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_definition
ALTER TABLE user2 ADD foregin KEY(pid) REFERENCES provinces(id);
- 添加默认约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_definition
ALTER TABLE user2 ALTER age SET DEFAULT 15;
修改表时删除
- 删除非空约束
ALTER TABLE studentinfo MODIFY COLUMN stuName VARCHAR(20) NULL;
- 删除默认约束
ALTER TABLE studentinfo MODIFY COLUMN age INT;
- 删除主键
ALTER TABLE studentinfo DROP PRIMARY KEY;
- 删除唯一
ALTER TABLE studentinfo DROP INDEX `name`;
- 删除外键
ALTER TABLE studentinfo DROP FOREIGN KEY;
相关文章
- sqlserver 存储过程中拼接sql语句 动态执行
- ORACLE SQL调优案例一则
- SQL SERVER 2012启动失败 because upgrade step 'SSIS_hotfix_install.sql' 失败
- SQL语句中有关单引号、双引号和加号的问题
- java.sql.SQLException: ORA-28001: 口令已经失效
- [SQL] 理解SQL SERVER中的逻辑读,预读和物理读
- 【学习总结】SQL的学习-2-sql操作
- Atitit sql查询语法 SQL SELECT完整语法3 1.SELECT语法3 2.FROM子句5 3.WHERE子句6 下面两张表将在后面使用到7 1.比较运算符7 2.逻辑
- Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
- SQL基础【十二、Like】
- SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
- sql 中的导航函数 FIRST_VALUE, LAST_VALUE
- SQL基础--> 约束(CONSTRAINT)
- SQL——Sql_Server中如何判断表中某字段、判断表、判断存储过程以及判断函数是否存在
- SQL 中With as 的用法
- facebook Presto SQL分析引擎——本质上和spark无异,分解stage,task,MR计算