我有这些表:
user
id
permission
id
user_id
old_permission
user_id
value
值:
user
id
1
2
3
permission
id user_id
1 1
2 2
old_permission
user_id value
1 f
2 f
3 t
正如表名所示,我正在从遗留的权限系统迁移。我想做的是:
当old_permission.value为't'时,我希望删除用户权限中的任何匹配行。因此,如果用户3在权限表中有一个条目,那么如果它的old_permission.value='t',它就会被删除。
如果关联的old_permission.value='f'
如何创建这样的约束?
我会创建一个存储过程,根据Old_Permission表刷新Permission表:
CREATE PROCEDURE RefreshPermissions()
AS
BEGIN
DELETE
Permission
WHERE
EXISTS
(SELECT
NULL
FROM
Old_Permission
WHERE
Permission.user_id = Old_Permission.user_id
AND Old_Permission.Value = 't');
INSERT INTO
Permission (user_id)
SELECT
Old_Permission.user_id
FROM
Old_Permission
LEFT JOIN Permission ON Old_Permission.user_id = Permission.user_id
WHERE
Old_Permission.Value = 'f'
AND Permission.user_Id IS NULL;
END;
然后,我建议使用Old_Permission表上的触发器根据需要修改Permission表。类似这样的东西:
CREATE TRIGGER
TR_Old_Permission
AFTER INSERT OR UPDATE OR DELETE ON
Old_Permission
EXECUTE PROCEDURE
RefreshPermissions();
我无法理解你的确切问题,因为我想让你理解sql中约束的概念,包括它的定义和类型。
约束用于限制可以进入表的数据类型。
可以在创建表时(使用CREATE table语句)或在创建表后(使用ALTER table语句)指定约束。
约束类型:
•不为空
•独特的
•主键
•外键
•检查
•默认
用每个约束的小例子来说明约束类型:-
SQL NOT NULL约束
•NOT NULL约束强制列不接受NULL值。
•NOT NULL约束强制字段始终包含一个值。这意味着你无法插入新记录,或在不向该字段添加值的情况下更新记录。
•以下SQL强制"p_Id"列和"LastName"列不接受NULL值:
•创建桌上人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255)
)
SQL UNIQUE约束
UNIQUE约束唯一地标识数据库表中的每个记录。
CREATE TABLE 上的SQL UNIQUE约束
当"Persons"表
创建:
MySQL:
创建表格人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255),
唯一(p_Id)
)
SQL Server/Oracle/MS访问:
创建表格人员
(
p_Id int NOT NULL UNIQUE,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255)
)
允许命名UNIQUE约束,并在多个列,使用以下SQL语法:
MySQL/SQL Server/Oracle/MS访问:
创建表格人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255),
CONSTRAINT uc_PersonID UNIQUE(p_Id,姓氏)
)
ALTER TABLE 上的SQL UNIQUE约束当表已经创建时,要在"p_Id"列上创建UNIQUE约束,
请使用以下SQL:
MySQL/SQL Server/Oracle/MS访问:
ALTER TABLE Persons
添加唯一(p_Id)
允许命名UNIQUE约束,并在多个列,使用以下SQL语法:
MySQL/SQL Server/Oracle/MS访问:
ALTER TABLE Persons
添加CONSTRAINT uc_PersonID UNIQUE(p_Id,姓氏)
删除唯一约束
要删除UNIQUE约束,请使用以下SQL:
MySQL:
ALTER TABLE Persons
删除索引uc_PersonID
SQL Server/Oracle/MS访问:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
SQL主键约束
PRIMARY KEY约束唯一地标识数据库表中的每个记录。
主键必须包含唯一的值。
主键列不能包含NULL值。
每个表都应该有一个主键,并且每个表只能有一个主关键字。
CREATE TABLE 上的SQL主键约束
当"Persons"表为时,以下SQL在"p_Id"列上创建PRIMARY KEY
创建:
MySQL:
创建表格人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255),
主键(p_Id)
)
SQL Server/Oracle/MS访问:
创建表格人员
(
p_Id int NOT NULL主键,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255)
)
允许命名PRIMARY KEY约束,并在多列,使用以下SQL语法:
MySQL/SQL Server/Oracle/MS访问:
创建表格人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255),
CONSTRAINT pk_PersonID主键(p_Id,姓氏)
)
CREATE TABLE 上的SQL FOREIGN KEY约束
当"Orders"表为创建时间:MySQL:
创建表格订单
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
p_Id int,
主密钥(O_Id),
外国密钥(p_Id)推荐人
)
SQL Server/Oracle/MS访问:
创建表格订单
(
O_Id int NOT NULL主键,
OrderNo int NOT NULL,
p_Id int外国关键推荐人(p_Id)
)
允许命名FOREIGN KEY约束,并在多列,使用以下SQL语法:MySQL/SQL Server/Oracle/MS访问:
创建表格订单
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
p_Id int,
主密钥(O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY(p_Id)
推荐人(p_Id)
)
CREATE TABLE 上的SQL CHECK约束
当"Persons"表创建。CHECK约束指定列"P_Id"只能包含大于0的整数。
MySQL:
创建表格人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255),
检查(p_Id>0)
)
SQL默认约束
DEFAULT约束用于在列中插入默认值。
CREATE TABLE 上的SQL DEFAULT约束
当"Persons"表已创建:
我的SQL/SQL Server/Oracle/MS访问:
创建表格人员
(
p_Id int NOT NULL,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
地址varchar(255),
城市varchar(255)默认"Sandnes">
)
DEFAULT约束也可以用于插入系统值,方法是使用以下函数GETDATE():
创建表格订单
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
p_Id int,
订单日期DEFAULT GETDATE()
)
上面的解释是使用约束的一般格式,希望它能帮助你克服你的问题。。。。。。。。。。。。。。。。。。。。。。。。。。。