0

我有这些表:

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' 我还想在权限表中创建一行

如何创建这样的约束?

4

3 回答 3

1

我将创建一个基于 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();
于 2013-02-07T16:25:47.653 回答
-1

PL/SQL 是 Oracle 的一部分。约束是 SQL 而不是 PL/SQL 的一部分。你不能像这样创建约束。您需要编写一些代码,可能是根据您的逻辑删除和插入的过程和/或触发器。基本上,在迁移时,我不知道您究竟在做什么迁移以及如何迁移,您遍历记录,然后根据您的条件/过滤器删除和插入记录。很难提出更多建议,因为我需要更多细节来决定在你的情况下如何以及做什么。

于 2013-02-07T15:55:00.007 回答
-1

我无法理解你的确切问题,因为我想让你理解 sql 中约束的概念,包括它的定义和类型。

约束用于限制可以进入表的数据类型。

可以在创建表时(使用 CREATE TABLE 语句)或创建表后(使用 ALTER TABLE 语句)指定约束。

约束类型:

•非空

•独特

•首要的关键

•外键

•查看

•默认

用小例子解释约束的类型:-

SQL NOT NULL 约束

•NOT NULL 约束强制列不接受NULL 值。

• NOT NULL 约束强制字段始终包含一个值。这意味着如果不向该字段添加值,您将无法插入新记录或更新记录。

•以下 SQL 强制“P_Id”列和“LastName”列不接受 NULL 值:

•创建表人

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255)

)

SQL 唯一约束

UNIQUE 约束唯一标识数据库表中的每条记录。

CREATE TABLE 上的 SQL 唯一约束

当“Persons”表时,以下 SQL 在“P_Id”列上创建 UNIQUE 约束

被建造:

MySQL:

创建表人员

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255),

唯一 (P_Id)

)

SQL Server / Oracle / MS 访问:

创建表人员

(

P_Id int NOT NULL 唯一,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255)

)

要允许命名 UNIQUE 约束并在多个列上定义 UNIQUE 约束,请使用以下 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

创建表人员

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255),

约束 uc_PersonID 唯一 (P_Id,LastName)

)


ALTER TABLE 上的 SQL 唯一约束

要在已创建表时在“P_Id”列上创建 UNIQUE 约束,请
使用以下 SQL:

MySQL / SQL Server / Oracle / MS Access:

改变表人

添加唯一 (P_Id)

要允许命名 UNIQUE 约束并在多个列上定义 UNIQUE 约束,请使用以下 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

改变表人

添加约束 uc_PersonID 唯一 (P_Id,LastName)


删除唯一约束

要删除 UNIQUE 约束,请使用以下 SQL:

MySQL:

改变表人

删除索引 uc_PersonID

SQL Server / Oracle / MS 访问:

改变表人

删除约束 uc_PersonID


SQL 主键约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录。

主键必须包含唯一值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,每个表只能有一个主键。


CREATE TABLE 上的 SQL PRIMARY KEY 约束

以下 SQL 在“Persons”表为“P_Id”列时创建主键

创建:

MySQL:

创建表人员

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255),

主键 (P_Id)

)

SQL Server / Oracle / MS 访问:

创建表人员

(

P_Id int 非空主键,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255)

)

要允许命名 PRIMARY KEY 约束并在多个列上定义 PRIMARY KEY 约束,请使用以下 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

创建表人员

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255),

约束 pk_PersonID 主键 (P_Id,LastName)

)


CREATE TABLE 上的 SQL FOREIGN KEY 约束

以下 SQL 在创建“Orders”表时在“P_Id”列上创建一个 FOREIGN KEY: MySQL:

创建表订单

(

O_Id int 非空,

OrderNo int NOT NULL,

P_Id 整数,

主键(O_Id),

外键 (P_Id) 参考人员 (P_Id)

)

SQL Server / Oracle / MS 访问:

创建表订单

(

O_Id int NOT NULL PRIMARY KEY,

OrderNo int NOT NULL,

P_Id int FOREIGN KEY REFERENCES Persons(P_Id)

)

要允许命名 FOREIGN KEY 约束并在多个列上定义 FOREIGN KEY 约束,请使用以下 SQL 语法:MySQL / SQL Server / Oracle / MS Access:

创建表订单

(

O_Id int 非空,

OrderNo int NOT NULL,

P_Id 整数,

主键(O_Id),

约束 fk_PerOrders 外键 (P_Id)

参考人员(P_Id)

)


CREATE TABLE 上的 SQL CHECK 约束

以下 SQL 在创建“Persons”表时在“P_Id”列上创建 CHECK 约束。CHECK 约束指定列“P_Id”只能包含大于 0 的整数。

MySQL:

创建表人员

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255),

检查 (P_Id>0)

)


SQL 默认约束

DEFAULT 约束用于在列中插入默认值。

CREATE TABLE 上的 SQL DEFAULT 约束

当创建“Persons”表时,以下 SQL 在“City”列上创建一个 DEFAULT 约束:

我的 SQL / SQL Server / Oracle / MS Access:

创建表人员

(

P_Id int 非空,

姓氏 varchar(255) 非空,

名字 varchar(255),

地址 varchar(255),

城市 varchar(255) 默认 'Sandnes'

)

DEFAULT 约束也可用于插入系统值,通过使用 GETDATE() 之类的函数:

创建表订单

(

O_Id int 非空,

OrderNo int NOT NULL,

P_Id 整数,

OrderDate 日期 DEFAULT GETDATE()

)

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

于 2013-02-07T16:20:31.243 回答