SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)
注意:
A.表中有数据不能创建约束
B.视图下设置后,要点击保存(只有保存后在才看的到)
c 别忘了,点刷新,才会出来呀!
1、主键约束 primary key
主键是每行的唯一标识符,仅仅通过它就能准确定位到一行,其中主键列在整个表中不能有重复,必须包含唯一的值(不能为NULL)。
alter table t_group
alter column id int not null --修改字段类型
go
alter table t_group
add constraint pk_group_Id --字段创建主键约束
primary key(id)
go
constraint [kənˈstrent] 约束
2、外键约束 foreign key
外键既能确保数据完整性,也能表现表之间的关系。添加了外键之后,插入引用表的记录要么必须被引用表中被引用列的某条记录匹配,要么外键列的值必须设置为NULL。
外键和主键不一样,每个表中的外键数目不限制唯一性。在每个表中,每一有-~253个外键。唯一的限制是一个列只能引用一个外键。一个列可以被多个外键引用。
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的。
比如说:
create table t_group ( id int not null, name varchar(30), primary key (id)
); insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete cascade on update cascade
); insert into t_user values (1, 'qianxin', 1); --可以插入
insert into t_user values (2, 'yiyu', 2); --可以插入
insert into t_user values (3, 'dai', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符 insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; --导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; --导致t_user中的1记录的groupid级联修改为2
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);
insert into t_user values (1, 'qianxin', 1); --可以插入
insert into t_user values (2, 'yiyu', 2); --可以插入
insert into t_user values (3, 'dai', 3); --错误,无法插入,用户组3不存在,与参照完整性约束不符
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; --导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; --导致t_user中的1记录的groupid级联修改为2
3、唯一约束unique
指定列中的每个值必须是唯一的。可以多列唯一。
alter table Accountadd constraint AK_AccountName --约束名unique (Account_Name) -- 列名
alter table Account
add constraint AK_AccountName --约束名
unique (Account_Name) -- 列名
补充:
1.主键约束(PRIMARY KEY)
1) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键。
2) 是不可能(或很难)更新.
3) 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).
4) 主健可作外健,唯一索引不可;
2.唯一性约束(UNIQUE)
1) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束.
2) 只要唯一就可以更新.
3) 即表中任意两行在 指定列上都不允许有相同的值,允许空(NULL).
4) 一个表上可以放置多个唯一性约束
3.唯一索引(INDEX)
创建唯一索引可以确保任何生成重复键值的尝试都会失败。
唯一性约束和主键约束的区别:
(1).唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。
(2).在创建唯一性约束和主键约束时可以创建聚集索引和非聚集索引,但在 默认情况下主键约束产生聚集索引,而唯一性约束产生非聚集索引
约束和索引, 前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。
唯一性约束与唯一索引有所不同:
(1).创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。
(2).创建唯一索引只会创建一个唯一索引,不会创建Constraint。
也就是说其实唯一约束是通过创建唯一索引来实现的。
在删除时这两者也有一定的区别:
删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,
而删除了唯一索引的话就可以插入不唯一的值。
4、CHECK约束
CHECK约束约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另外一个列的值,只要这些列都在同一个表中以及值是在更新或者插入的同一行中。CHECK约束还可以用于检查列值组合是否满足某一个标准。
可以像使用where子句一样的规则来定义CHECK约束。CHECK约束条件的示例如下:
目标 |
SQL |
限制Month列为合适的数字 |
BETWEEN 1 AND 12 |
正确的SSN格式 |
LIKE'[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' |
限制为一个快递公司的特定列表 |
IN('UPS','Fed Ex',EMS') |
价格必须为正数 |
UnitPrice >= 0 |
引用同一行中的另外一列 |
ShipDate >= OrderDate |
上面给出的列表只是一小部分,而条件实际上市无限多的。几乎所有可以放到where子句的条件都可以放到该约束中。而且和其他选择(规则和触发器)相比,CHECK约束执行速度更快。
在已存在的表中添加一个CHECK约束:
alter table Account
add constraint CN_AccountAge
check
(Account_Age > 18); -- 插入年龄必须大于18
如果此时视图添加一条不满足的记录,将报如下错误:
insert into Accountvalues (22,'洪',17)
消息547,级别16,状态0,第1 行
INSERT 语句与 CHECK 约束"CN_AccountAge"冲突。该冲突发生于数据库"Nx",表"dbo.Account", column 'Account_Age'。
语句已终止。
5、DEFAULT约束
DEFAULT约束在INSERT INTO语句没有为列指定值的时候提供一个默认值。
示例
例如,以下SQL创建了一个名为CUSTOMERS的表,包含5个列。其中,SALARY列的默认值为5000.00,如果INSERT INTO语句没有为该列指定值,将会使用默认的5000.00。
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2) DEFAULT 5000.00, PRIMARY KEY
PRIMARY KEY (ID)
);
如果该表已经存在,你可以使用类似以下的语句为SALARY列添加一个NOT NULL约束:
ALTER TABLE CUSTOMERS
MODIFY SALARY DECIMAL (18, 2) DEFAULT 5000.00;
删除默认约束
使用以下SQL删除DEFAULT约束:
ALTER TABLE CUSTOMERS
ALTER COLUMN SALARY DROP DEFAULT;
禁用约束
ALTER TABLE CUSTOMERS
WITHNOCHECK ------- 临时禁用约束
ADD CONSTRAINT
CHECK ........
SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)相关推荐
- default默认值 unique单列唯一和联合唯一 primary key主键 auto_increment自增 外键foregin key 表与表之间关系
约束条件 之前讲过: zerofill (填充0) unsigned (约束条件值unsigned 无符号) not null 非空(不能插入空) 补充知识点 插入数据的时候可以指定字段 create ...
- mysql外键约束案例_SQLServer FOREIGN KEY外键约束讲解及使用实例
FOREIGN KEY约束添加规则 1.外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列. 2.如果在 FOREIGN KEY 约束的列中输入非 NU ...
- sql语句创建表的同时添加外键约束
sql语句创建表的同时添加外键约束 题目 建立一个商店的数据库store,记录顾客及其购物情况,由下面三个表组成: 商品(商品号,商品名,单价,商品类别,供应商): 顾客(顾客号,姓名,住址): 订单 ...
- mysql一对一外键约束_MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表...
我们在同一数据库创建的表时候,很多时候会出现相同数据的冗余问题,也就是说几个id会有一个或者同n个相同字段,这样就导致数据表结构数据重复冗余, 冗余还无所谓,关键是如果我要改其中一个相同的字段信息,其 ...
- 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引
MySQL无法删除外键约束中所需的索引 我需要更改现有数据库以添加列. 因此,我还想更新UNIQUE字段以包含该新列. 我试图删除当前索引但仍然收到错误MySQL Cannot drop index ...
- 我爷爷来了都能看懂的数据库主键,候选键,外键,非空和check的几种约束方式及使用方法
我们都知道在数据库MYSQL当中有三种不同的完整性约束,分别为:实体完整性,参照完整性和用户定义完整性. 直接上干货篇: 通俗的讲:实体完整性是用来约束主键(primary key)和候选键(uniq ...
- oracle外键约束怎么删除,mysql oracle 删除外键约束
oracle 删除外键约束 禁用约束 启用约束 oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码 select 'alter table ' ...
- 如何列出引用SQL Server中给定表的所有外键?
我需要在SQL Server数据库中删除一个高度引用的表. 我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL的答案更好.) #1楼 ...
- mysql 删除外键 sql语句_sql server ql语句删除外键和删除
sql server ql语句删除外键和删除 alter table tablename add constraint ordersrelationship foreign key mployeeid ...
- mysql foreign key 设置_mysql foreign key(外键) 说明与实例
一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...
最新文章
- python 中__name__ = '__main__' 的作用
- 网站架构相关PPT、文章整理
- linux日志文件备份,linux配置文件、日志文件全备份
- 更新fielddata为true_线程与更新UI,细谈原理
- 启动TOMCAT报错 java.util.zip.ZipException: invalid LOC header (bad signature)
- POP3与IMAP协议
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
- Linux操作系统原理与应用07:内核同步
- AS3 Signals之入门篇
- 【Wonder整理】防止重复提交并弹出半透明对话框
- idean中jsp页面乱码_IntelliJ IDEA 控制台 乱码 有效解决办法
- ExtJS 4正式版今天发布
- Python语言程序设计----【第8周 程序设计方法学】之8.2 Python程序设计思维
- 越来越火的图数据库到底能做什么?
- 【机器学习】基于生成对抗网络的黑白图片上色
- 设置360浏览器的背景为护眼模式(浅豆绿色)
- vue项目json格式化显示
- 计算几何(证明三角形内心公式: aOA+bOB+cOC = 0)
- CSS设置图像的透明度
- mysql查询优化-查询缓存