要插入或删除的PSQL/SQL约束



我有这些表:

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();
PL/SQL是Oracle的一部分。约束是SQL的一部分,而不是PL/SQL。不能创建这样的约束。您需要编写一些代码,可以是根据您的逻辑删除和插入的过程和/或触发器。基本上,在迁移时,我不知道您到底在做什么以及如何迁移,您可以循环浏览记录,然后根据您的条件/过滤器删除和插入记录。很难再提出更多建议了,因为我需要更多的细节来决定在你的情况下该怎么做以及该怎么做。

我无法理解你的确切问题,因为我想让你理解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()

)

上面的解释是使用约束的一般格式,希望它能帮助你克服你的问题。。。。。。。。。。。。。。。。。。。。。。。。。。。

最新更新