SQL Informix-添加外键

问题描述 投票:0回答:1

在Informix DB中用外键创建新数据库表时,我很挣扎。

我需要从一个数据库迁移到另一个数据库。我正在使用DBeaver作为数据库浏览和编辑工具。我正在尝试像这样运行脚本(我只是更改了名称)。这些命令来自DBeaver DDL导出本身,因此应该就是这样。

DROP TABLE IF EXISTS eapp:test_table1;
CREATE TABLE eapp:test_table1 (
    column1 smallint NOT NULL,
    PRIMARY KEY (column1) CONSTRAINT table1_pk
);

DROP TABLE IF EXISTS eapp:test_table2;
CREATE TABLE eapp:test_table2 (
    column1 smallint NOT NULL,
    column2 varchar(100) NOT NULL,
    column3 smallint NOT NULL,
    column4 smallint,
    PRIMARY KEY (column1) CONSTRAINT table2_pk,
    FOREIGN KEY (column4) REFERENCES eapp:test_table1(column1) ON DELETE RESTRICT ON UPDATE RESTRICT CONSTRAINT table2_fk
);

但是,执行不断崩溃,并显示一条奇怪的修剪错误消息:

SQL execution error message

[该语言为捷克语,它表示类似“语法错误。(重要提示:数据库服务器,该”。但是其余部分都进行了细化,所以我不知道发生了什么。

完整堆栈:

org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [42000]: Chyba syntaxe. (Důležitá poznámka: Databázové servery, které
    at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:134)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:473)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:412)
    at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:148)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:405)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:865)
    at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:2833)
    at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:98)
    at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:148)
    at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:96)
    at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$17.run(ResultSetViewer.java:3356)
    at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:103)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.sql.SQLException: Chyba syntaxe. (Důležitá poznámka: Databázové servery, které
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413)
    at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3537)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3853)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2653)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2569)
    at com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2446)
    at com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2421)
    at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:393)
    at com.informix.jdbc.IfxStatement.a(IfxStatement.java:1326)
    at com.informix.jdbc.IfxStatement.executeImpl(IfxStatement.java:1296)
    at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1007)
    at com.informix.jdbc.IfxStatement.execute(IfxStatement.java:893)
    at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:338)
    at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:131)
    ... 12 more
Caused by: java.sql.SQLException
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3858)
    ... 23 more

我无法以这种方式向Google发送消息,所以我想在这里询问是否有人对Informix DB有一定的经验,并且可能会给我一些提示。

我已经尝试从表创建中删除FK声明,然后通过ALTER TABLE将其添加,但是产生的效果相同...

sql informix
1个回答
0
投票

DBeaver没有生成有效的Informix DDL。 Informix不理解ON DELETE RESTRICT ON UPDATE RESTRICT语法。

从在线手册:

REFERENCES Clause

|--REFERENCES--table--+------------------+---------------------->
                      |    .-,------.    |   
                      |    V        |    |   
                      '-(----column-+--)-'   

>--+-------------------------+----------------------------------|
   |  (1)                    |   
   '-------ON DELETE CASCADE-'   
© www.soinside.com 2019 - 2024. All rights reserved.