在Oracle SQL开发人员中可以做这样的事情吗
CREATE FUNCTION fnCheckValid(accountidd IN NUMBER)
RETURN NUMBER
IS retval NUMBER(4,0);
BEGIN
SELECT COUNT(accountid_fk)
INTO retval
FROM tbl_AccountAuthentications
WHERE accountid_fk = accountidd;
RETURN(retval);
END;
/
ALTER TABLE tbl_AccountAuthentications
ADD CONSTRAINT chkCheckvalid CHECK(fnCheckValid(accountid_fk) <= 1);
我不断得到的错误是
Error starting at line 999 in command:
ALTER TABLE tbl_AccountAuthentications
ADD CONSTRAINT chkCheckvalid CHECK(fnCheckValid(accountid_fk) <= 1)
Error report:
SQL Error: ORA-00904: "FNCHECKVALID": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
该函数正在创建中,我可以找到它,但是当我尝试调用它时,我不断收到该错误
这就是我想要实现的
AccountID RegularID OpenID
1 5 null
1 null 10
1 null 11
1 6 <-- Forbidden
因此用户不能创建2个普通帐户,但可以拥有任意数量的OpenID帐户
该表设置如下
CREATE TABLE tbl_AccountAuthentications(
newAuthID NUMBER(4,0)
CONSTRAINT naid_pk PRIMARY KEY,
accountid_fk NUMBER(4,0)
CONSTRAINT accid_fk
REFERENCES tbl_UserAccounts(account_id),
regularid_fk NUMBER(4,0)
CONSTRAINT rgid_fk
REFERENCES tbl_StrongRoom(password_id),
openid_fk NUMBER(4,0)
CONSTRAINT opid_fk
REFERENCES tbl_OpenID(openid)
);
您要确保 AccountID 和 RegularID 列一起唯一,无论 OpenID 有多少个值。
正如您已经确定的那样,执行此操作的唯一方法是对其进行 约束 。您会在注释中注意到您已尝试使用触发器。这并 没有
在数据库中限制值,它只是确保它试图启用触发器时进行验证。我希望当您尝试它时,收到错误消息 “ ORA-04091:正在变异,触发器/功能可能看不到它”。
从表中选择时,您正在更改(插入或更新)过程中。
如果您必须对此加以限制,那就是您应该做的。这样做的问题是您的表未规范化。因此,将其标准化。使用两个表,而不要使用一个表。
首先,您需要您的 RegularID 在 AccountID
上是唯一的,这意味着它应该在此级别存储。tbl_UserAccounts
在此标识符上似乎是唯一的,因此请更改此表并在其中存储您的 RegularID
。
接下来,您需要一个表,该表具有与用户可能想要的一样多的 OpenID 。这意味着您需要一个在 AccountID 和 OpenID
1上唯一的表。
create table openid_account_auth (
, account_id number(4,0)
, open_id number(4,0)
, constraint pk_openid_account_auth
primary key (account_id, open_id)
, constraint fk_openid_account_auth_accid
foreign key (account_id)
references tbl_UserAccounts(account_id)
, constraint fk_openid_account_auth_open
foreign key (open_id)
references tbl_OpenID (openid)
);
此表(以及您自己的表)上的一点表示,多个帐户可以具有相同的 OpenID 。如果您不打算这样做,则应在其中添加 AccountID
作为外键tbl_OpenID
,这是确保每个 OpenID 仅与一个 AccountID 关联的唯一方法。
如果确实需要使用该视图,则可以创建视图以相同的方式获取信息。我不确定你为什么会这么做。
create or replace view AccountAuthentications as
select account_id, regular_id, null
from user_accounts
union all
select account_id, null, open_id
from openid_account_auth;
简而言之,除非受到严格的约束,否则您应该始终在自然级别存储数据,并使用数据库来确保保持完整性。如果随后需要稍微不同地使用数据,则可以使用视图或实例化视图等。
1.很抱歉,但是我不能让自己在每个表的名称前加上tbl_
。
主要内容:选取设置检查约束的字段,在创建表时设置检查约束,在修改表时添加检查约束,删除检查约束MySQL检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。 在《MySQL默认值》和《MySQL非空约束》中讲解的默认值约束和非空约束也可看作是特殊的检查约束。 选取设置检查约束的字段 检查约束使用 CHECK 关键字,具体的语法格式如下: C
主要内容:Oracle Check约束简介在本教程中,您将学习如何使用Oracle检查约束来强制域(列)的完整性。 Oracle Check约束简介 Oracle检查约束允许通过限制一列或多列所接受的值来强制执行域完整性。 要创建一个检查约束,可以定义一个返回或的逻辑表达式。 Oracle使用此表达式来验证正在插入或更新的数据。 如果表达式的计算结果为,则Oracle接受数据并进行插入或更新。 否则,Oracle将拒绝这些数据,新数据根本
问题内容: 我继承了一个使用MySQL的应用程序,该应用程序由PHP前端使用。编写此系统的人花了相当长的时间才能确保用户输入的代码有效- tat表示这些代码也存在于另一个表中。 当我第一次看到此消息时,我想知道为什么他没有使用CHECK约束并让dbms进行解决- 我设想有很多不同的程序会实现相同的检查,而不仅仅是dbms中的一个地方。然后我发现MySQL不支持Check约束(严格来说不是真的- 它
我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?
问题内容: 我有这两张表 Table: Guards Table: Squads 该列指向表中的列,我正在尝试创建一个约束,以检查链接到作为领导者提供的保护ID的列是否为特定值(在本例中为1) 这可能吗?还是我必须使用扳机? 问题答案: 您需要添加一个约束。我将约束包装到一个函数中,因为您需要检查另一个表的值。 该函数将检查防护等级是否足够高:请确保将其设置为适当的值,或者甚至更好地从另一个表中获
问题内容: 我有下表Goods_In_Wagon(Goods_ID,Wagon_ID,Total_Weight)。我需要创建一些if语句检查约束,说 “如果WAGON_ID在90到99之间,则Total_Weight必须大于10。” AND“如果WAGON_ID在100到110之间,则Total_Weight必须大于20。” AND“如果WAGON_ID在111到120之间,则Total_Weig