所以我正在處理2個表格:人員和婚姻。 人擁有很多屬性,他的PK是person_id。 婚姻法的定義那樣:將用戶定義的約束添加到SQL表中
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
現在米試圖將它連接到婚姻表這樣做:
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)
那麼,我做錯了什麼?是否有可能做這樣的邏輯約束?
函數的DDL看起來像SQL Server的T-SQL,而不是Oracle的PL/SQL。你確定你在使用Oracle嗎?爲什麼你不只是使用外鍵約束? –
好吧,我是,因爲我是新手,所以我可能會修改一些不相關的代碼。外鍵約束是什麼意思?是否可以添加邏輯語句if(Person_id.age> Relative_id.age)返回true。 ? –
您的全班在Stack Overflow上發佈這個作業嗎?我昨天回答了完全相同的問題(由另一張海報發佈) - 我提供了一個只需要標準SQL並且不需要觸發器的解決方案。 https://stackoverflow.com/questions/44601943/oracle-sql-check-constraint-between-2-tables/44604201#44604201 – mathguy