SQL外键约束如何添加 外键约束添加的4个步骤

让我告诉你外键约束。
这些年我没遇到过很多坑,但是这个是无法避免的。

我记得有一次我在上海做电子商务系统。
客户给了我很大的压力,我可以疯狂地编写代码。
结果上线没多久,数据就乱了,数据不一致的情况也越来越频繁。
后来检查了一下,发现外键约束没有正确应用。
想想看,orders 表中的用户 id 有时是随机填充的,甚至不在 users 表中,那有什么意义呢?
所以,当你添加外键约束时,你必须一步一步来。

首先你需要了解什么是父表,什么是子表。
例如,您有一个名为 users 的用户表和一个名为 orders 的订单表。
每个订单必须对应一个用户,那么users是父表,orders是子表。
如果这一步做错了,其他的一切都白费了。

其次,确认子表中的哪个字段作为外键以及父表中的哪个主键字段对应。
像我的orders表,必须有一个user_id字段,它必须指向user表的id字段。
如果这一步出错,数据将无法连接,也无法查看。

第三,编写SQL语句。
这一步是最简单的,但是一定要小心。
只需使用 ALTER TABLE 语句并添加 FOREIGN KEY 约束即可。
例如写:
sql 更改表订单添加约束 fk_orders_user_id 外键 (user_id) 引用用户 (id);
这句话是什么意思呢?只需向订单表添加一个名为 fk_orders_user_id 的外键约束即可。
这个外键就是user_id字段,它必须引用user表的id字段。
编写完成后,在MySQL Workbench或Navicat中运行它。

第四,执行力。
执行后,外键就会生效。
此时,您正尝试将 user_id 插入订单表中。
如果不在user表中,数据库会直接把你停掉,数据不会不一致。
这称为数据完整性。

然后还有数据一致性,这个要看情况。
例如,如果父表的ID改变了,子表的外键也必须改变吗?这需要添加 ON UPDATE CASCADE。
如果删除了父表中的一条记录,是否也要删除子表中的相关记录?这需要添加 ON DELETE CASCADE。
总计为:
sql 更改表订单添加约束 fk_orders_user_id 外键(user_id)引用用户(id)在更新级联上删除级联;
这意味着一旦父表users的ID更新,子表orders的用户ID也会更新。
当删除父表users中的记录时,与下级表orders关联的记录也会被删除。
这样可以省去很多麻烦,而且不需要在应用层逐一检查。

但也有陷阱。
例如,如果添加ON DELETE CASCADE并意外删除了父表记录,则子表的很大一部分也会被删除。
可以吗?所以在添加这些选项之前你需要考虑清楚。

另外,如果两个表相互引用,例如表A引用表B,表B引用表A,也会出现问题。
这称为循环依赖。
我曾经在杭州遇到过一个项目太复杂,最后卡住了。
这时候就需要想办法解决了。
您可以尝试延迟约束检查,该检查正在等待中交易在您检查之前已提交。
或者一步步添加外键,首先将外键添加到一个表,更改第二个表的结构并添加约束。
最鲁莽的就是重新设计表结构,比如合并表或者增加中间表。
这个事情要分情况而定,不能一概而论。

总的来说,外键约束的优点是可以提高搜索效率,优化多表连接。
它还可以简化业务逻辑,无需在应用层对数据进行一一验证。
但缺点也相当明显。
插入、更新和删除需要额外的检查和限制,有时会比较慢。
不过,为了获得可靠的数据,这种性能成本还是值得的。

所以,当你添加外键约束时,你必须仔细设计它们。
不要只图一时省事,否则以后会有很多陷阱。
这些年我经历了太多的苦难,才明白了这个道理。

SQL里面constraint

SQL 约束用于维护数据库完整性。

创建约束:
ALTERTABLE 表名 ADDCONSTRAINT 约束名称 约束类型(约束内容)
示例:
表 A 和表 B,表 B 的列必须引用表 A 的列,并建立外键约束。

表的 B 列必须是唯一的,从而创建唯一约束。

表的 B 列必须为非空,并且必须创建非空约束。

表B列中的值必须满足一定的条件才能创建检查约束。

建表时添加约束:
CREATETABLEstudent(studentIdintprimarykeynotnull,studentNamevarchar(8 ),ageint);
建表后添加约束:
ALTERTABLEstudentaddconstraintyyprimarykey(studentId);
删除约束:
ALTERTABLEstudentdropconstraintyy;
主键约束:
标识唯一的行。
不能为空并强制创建聚集索引。

唯一约束:
允许 NULL 值、多列并创建唯一索引。

抱怨:我写了很多,但没有把重要的区别说清楚。

sql数据库唯一约束怎么设置 sql唯一约束设置方法

上周我的朋友问我有关独特的 SQL 约束的问题。

唯一的限制是确保特定列中的数据不重复。

例如,如果在电子邮件地址列中添加唯一性约束,则一个电子邮件地址只能注册一次。

有两种设置方法。

一种是建表时直接添加。

sql 创建表用户( ID INT 主键, 电子邮件 VARCHAR(1 00) 唯一 );
另一种是修改表时添加。

sql ALTER TABLE 用户添加约束 uc_email UNIQUE(电子邮件);
需要注意的是多列组合的独特局限性。

例如,订单表product_id和customer_id必须唯一组合。

sql 创建表订单( 产品 ID INT, 客户 ID INT, 唯一(产品 ID、客户 ID) );
唯一约束会自动创建索引,但速度有点慢。

与主键不同,主键不能为空,唯一约束也可以为空。

一张表只能有一个主键,但可以有多个唯一约束。

在创建表之前,请考虑哪些列需要唯一约束。

复杂的规则不起作用,例如数量大于1 00。

我不确定这部分,这取决于数据库类型。

算了。

如何用SQL语句给表里加主键加索引

哎呀,让我告诉你有关 SQL 的事情。
当我进入这个行业时,我曾多次陷入困境。

给表添加主键和索引,视情况而定。

例如,我在 2 01 4 年刚刚加入一家新公司。
我有一个名为 users 的旧表,其中包含数千个数据点,并且没有主键。
想一想,如果以后查数据,找到用户,那不是大海捞针吗?只需添加主键即可,ALTER TABLE ADD PRIMARY KEY(id);用户,却发现id列全部为空,崩溃了。
所以建表的时候最好加上主键。
比如建表的时候这样写: SQL 用户创建表( 标识符 INT NOT NULL AUTO_INCRMENT, 用户名 VARCHAR(5 0) NOT NULL, 主键(标识符) );
这样 id 就是主键,数据库会自动为您创建唯一索引。

此外,索引越多越好。
2 01 5 年,我正在做另一个项目,看到一位朋友为每列添加了一个索引。
结果如何?查询速度快一点,但是写入数据的时候数据库挂了。
为了什么?因为每次写入数据时都必须更新所有索引。
后来我们对表进行了拆分,精简了索引,性能立马提升了。

所以添加索引要看情况。
例如,如果您经常在 WHERE 子句中使用某一列,请为该列添加索引以加快查询速度。
例如,在users表中,如果您经常按用户名检查用户,请添加以下内容: SQL CREATE INDEX idx_username ON users(username);
这样通过用户名搜索速度更快。

但请注意,索引并非没有缺点。
我在 2 01 7 年遇到过一个有数百列的表,并且每列都建立了索引。
结果如何?表大小直接膨胀到几个G,写入数据时数据库响应极其缓慢。
因此必须适当地使用该索引。

总之,添加主键和索引要根据实际情况而定,不要盲目添加。