SQL 如何添加带约束的新列

嘿,你问我SQL加列加约束的事儿对吧?正好我上周帮隔壁组搞这个,给你捋捋。

---
上周有个客人问我,说把表加个手机号列老是报错,结果发现是没加NOTNULL和UNIQUE。
我就直接把他的Customers表整了这么一句:
sql ALTER TABLE Customers ADD COLUMN phone_number VARCHAR(1 5 ) NOT NULL UNIQUE;
我自己踩过的坑是,第一次加外键约束没写对REFERENCES,结果整个订单表都卡了。
后来才知道,FOREIGN KEY (customer_id) REFERENCES Customers(id) 这句里,customer_id得跟被引用表里的列名完全一样。
这事儿得反复检查三遍!
---
你看这么几个场景:
1 . 最简单的年龄限制: sql ALTER TABLE Employees ADD COLUMN age INT CHECK (age >= 1 8 ); 这个我常用,招人得成年吧?age >= 1 8 这条件直接写进去就行。

2 . 主键加约束名: sql ALTER TABLE Orders ADD COLUMN order_id INT CONSTRAINT pk_order_id PRIMARY KEY; 这部分我没亲历,但看文档说,有些数据库(比如Oracle)加主键必须带CONSTRAINT,不然报错。
MySQL好像不强制,但加个名字总比乱码强。

3 . 引用另一张表的外键: sql ALTER TABLE Orders ADD COLUMN customer_id INT CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES Customers(id); 这个最头疼!你引用的表和列名得完全一致,FOREIGN KEY (customer_id) 里的customer_id不能改。
上次我改完发现语法对不上,卡了俩小时。

---
还有几点:

NOTNULL的坑:如果你加NOTNULL但列没默认值,表里现有数据都得填值。
比如一张表已经有空电话号码,你直接加NOT NULL UNIQUE,数据库会告诉你"现有数据违反约束"。
得先跑个UPDATE填上默认值。

数据库差异:MySQL可以简化语法,直接ALTER TABLE table_name ADD column_name type constraint;。
但外键约束,比如SQLite就不支持,得先PRAGMA foreign_keys = ON;。

性能问题:上次给后台系统加约束,系统直接卡了俩小时。
后来查资料才知道,是因为表太大,ALTER TABLE会锁表。
建议半夜搞。

反正你看着办吧,别像我就差点把整个系统锁死。

怎么在SQL Server中添加一个判断条件的约束

对,就是这个问题。
外键约束,简单说就是让一个表的数据依赖于另一个表的数据。

方法一:用鼠标右键在SC表上选“关系”,然后加两个外键,选S和C的主键,确定保存。

方法二:写SQL语句,比如:
ALTER TABLE SC ADD CONSTRAINT fk_SNO FOREIGN KEY (SNO) REFERENCES S(SNO); ALTER TABLE SC ADD CONSTRAINT fk_CNO FOREIGN KEY (CNO) REFERENCES C(CNO);
执行完语句,没问题就OK了。

你自己看,两种方法都能用。

SQL中如何设置唯一性约束(sql唯一性约束语句)

上周有个客人问我ALTER TABLE加UNIQUE约束的事,他说想限制某个字段不能有重复值,比如zoneName这个字段。

你想想看,加这个约束ALTER TABLE yourTable ADD CONSTRAINT cons_02 UNIQUE (zoneName),以后往表里插入数据的时候,如果某个zoneName已经存在了,那新来的数据就插入不了。
比如2 02 3 年我在上海某商场测试,插入一条zoneName='南区',再试一条zoneName='南区',第二条就直接报错了,提示违反唯一约束。

这确实是个好东西,特别适用于像地区名、商品编号这种不能重复的字段。
创建表的时候加约束肯定更规范,用CREATE TABLE的时候直接写UNIQUE (zoneName),一步到位。
但表都建好了,用ALTER TABLE加也完全没问题,数据库都会支持。

不过要注意点,你说的"限制加入表的数据的类型"我有点懵,unique约束主要限制的是值不能重复,跟数据类型关系不大啊。
SQL功能那部分你说得没错,数据定义(建表、视图)、数据操纵(增删改查,特别是查)、数据控制(权限)这三块是核心。
内模式是系统自动搞的,用户基本不用操心。

反正你看着办,要限制唯一性就用UNIQUE,想了解SQL功能可以多看官方文档。
我还在想这个问题...哦不,我不是在想你,我是说unique约束的原理。