gpt4 book ai didi

java - 向 SQL 表添加用户定义的约束

转载 作者:行者123 更新时间:2023-11-30 10:28:28 25 4
gpt4 key购买 nike

所以我正在处理 2 个表:Persons 和 Marriage。人有很多属性,他的PK是person_id。婚姻是这样定义的:

CREATE TABLE Marriage(Person_id NUMBER(6) PRIMARY KEY REFERENCES Persons(Person_id)
, Relative_id NUMBER(4) REFERENCES Persons(Person_id)
, Relationship_type VARCHAR(20) NOT NULL CHECK (Relationship_type IN('Wife', 'Husband', 'Child'))
)

我想给这个表添加一个约束,所以我添加了这个(TODO:Parent.age>Child.age):

CREATE FUNCTION fn_OlderThanSon (
@Parent NUMBER
@Child NUMBER
)
RETURNS VARCHAR(10)
AS
BEGIN
IF EXISTS (SELECT Person_id FROM Persons WHERE Person_id = @Parent)
AND EXISTS (SELECT Person_id FROM Persons WHERE Person_id = @Child)
return 'True'
return 'False'
END

现在当我尝试将它附加到 Marriage 表时:

ALTER TABLE Marriage ADD CONSTRAINT CK_OlderThan 
CHECK (fn_OlderThanSon(Person_id,Relative_id) = 'True');

我收到以下错误:

java.sql.SQLSyntaxErrorException: ORA-01735: invalid ALTER TABLE option

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:30)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:931)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1150)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1309)
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:422)
at com.company.Main.main(Main.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

那么,我做错了什么?甚至可以做这样的逻辑约束吗?

最佳答案

您想使用函数 fn_OlderThanSon() 来确保“parent”类型的记录早于“child”类型的记录:if (Person_id.age>Relative_id.年龄)

这样的业务规则需要断言 - 声明性多行约束 - 而不是简单的检查约束。目前 Oracle 不支持 CREATE ASSERTION(尽管有 an initiative to make this happen )。

现在,执行这样的规则需要过程逻辑,可以通过 Persons 表使用 PL/SQL API 直接调用,或通过触发器间接调用。触发器会很复杂,因为您必须解决可变表问题(您需要查询您正在主动更改的表中的记录),但许多人不喜欢在 PL/SQL 过程后面屏蔽表。

关于java - 向 SQL 表添加用户定义的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com