【问题标题】:Clarification on table creation error on CockroachDB关于 CockroachDB 上表创建错误的说明
【发布时间】:2020-01-07 13:39:23
【问题描述】:

我有一个使用 SQLalchemy 连接到 SQL 数据库的框架。 我试图让它与 CockroachDB 一起工作,即使官方支持仅限于 MySQL、Postgres 或 Oracle。

我正在执行的操作可以完美地使用受支持的 SQL 数据库。 使用 3 节点 CockroachDB 集群并非易事。

问题出现在以下 SQL 操作中:

CREATE TABLE dids (
    scope VARCHAR(25) NOT NULL,
    name VARCHAR(250) NOT NULL,
    account VARCHAR(25),
    did_type VARCHAR(1),
    is_open BOOLEAN,
    monotonic BOOLEAN DEFAULT '0',
    hidden BOOLEAN DEFAULT '0',
    obsolete BOOLEAN DEFAULT '0',
    complete BOOLEAN,
    is_new BOOLEAN DEFAULT '1',
    availability VARCHAR(1),
    suppressed BOOLEAN DEFAULT '0',
    bytes BIGINT,
    length BIGINT,
    md5 VARCHAR(32),
    adler32 VARCHAR(8),
    expired_at TIMESTAMP WITHOUT TIME ZONE,
    purge_replicas BOOLEAN DEFAULT '1',
    deleted_at TIMESTAMP WITHOUT TIME ZONE,
    events BIGINT,
    guid CHAR(32),
    project VARCHAR(50),
    datatype VARCHAR(50),
    run_number INTEGER,
    stream_name VARCHAR(70),
    prod_step VARCHAR(50),
    version VARCHAR(50),
    campaign VARCHAR(50),
    task_id INTEGER,
    panda_id INTEGER,
    lumiblocknr INTEGER,
    provenance VARCHAR(2),
    phys_group VARCHAR(25),
    transient BOOLEAN DEFAULT '0',
    accessed_at TIMESTAMP WITHOUT TIME ZONE,
    closed_at TIMESTAMP WITHOUT TIME ZONE,
    eol_at TIMESTAMP WITHOUT TIME ZONE,
    is_archive BOOLEAN,
    constituent BOOLEAN,
    access_cnt INTEGER,
    updated_at TIMESTAMP WITHOUT TIME ZONE,
    created_at TIMESTAMP WITHOUT TIME ZONE,
    CONSTRAINT "DIDS_PK" PRIMARY KEY (scope, name),
    CONSTRAINT "DIDS_ACCOUNT_FK" FOREIGN KEY(account) REFERENCES accounts (account) ON DELETE CASCADE,
    CONSTRAINT "DIDS_SCOPE_FK" FOREIGN KEY(scope) REFERENCES scopes (scope),
    CONSTRAINT "DIDS_MONOTONIC_NN" CHECK (MONOTONIC IS NOT NULL),
    CONSTRAINT "DIDS_OBSOLETE_NN" CHECK (OBSOLETE IS NOT NULL),
    CONSTRAINT "DIDS_SUPP_NN" CHECK (SUPPRESSED IS NOT NULL),
    CONSTRAINT "DIDS_ACCOUNT_NN" CHECK (ACCOUNT IS NOT NULL),
    CONSTRAINT "DIDS_PURGE_REPLICAS_NN" CHECK (PURGE_REPLICAS IS NOT NULL),
    CONSTRAINT "DIDS_CREATED_NN" CHECK (CREATED_AT IS NOT NULL),
    CONSTRAINT "DIDS_UPDATED_NN" CHECK (UPDATED_AT IS NOT NULL),
    CONSTRAINT "DIDS_TYPE_CHK" CHECK (did_type IN ('A', 'C', 'D', 'F', 'Y', 'X', 'Z')),
    CONSTRAINT "DIDS_AVAILABILITY_CHK" CHECK (availability IN ('A', 'D', 'L'))
)

最终出现以下错误:

invalid syntax: statement ignored: unimplemented at or near "cascade"
DETAIL: source SQL:
CREATE TABLE dids (
 scope VARCHAR(25) NOT NULL,
 name VARCHAR(250) NOT NULL,
 account VARCHAR(25),
 did_type VARCHAR(1),
 is_open BOOLEAN,
 monotonic BOOLEAN DEFAULT '0',
 hidden BOOLEAN DEFAULT '0',
 obsolete BOOLEAN DEFAULT '0',
 complete BOOLEAN,
 is_new BOOLEAN DEFAULT '1',
 availability VARCHAR(1),
 suppressed BOOLEAN DEFAULT '0',
 bytes BIGINT,
 length BIGINT,
 md5 VARCHAR(32),
 adler32 VARCHAR(8),
 expired_at TIMESTAMP WITHOUT TIME ZONE,
 purge_replicas BOOLEAN DEFAULT '1',
 deleted_at TIMESTAMP WITHOUT TIME ZONE,
 events BIGINT,
 guid CHAR(32),
 project VARCHAR(50),
 datatype VARCHAR(50),
 run_number INTEGER,
 stream_name VARCHAR(70),
 prod_step VARCHAR(50),
 version VARCHAR(50),
 campaign VARCHAR(50),
 task_id INTEGER,
 panda_id INTEGER,
 lumiblocknr INTEGER,
 provenance VARCHAR(2),
 phys_group VARCHAR(25),
 transient BOOLEAN DEFAULT '0',
 accessed_at TIMESTAMP WITHOUT TIME ZONE,
 closed_at TIMESTAMP WITHOUT TIME ZONE,
 eol_at TIMESTAMP WITHOUT TIME ZONE,
 is_archive BOOLEAN,
 constituent BOOLEAN,
 access_cnt INTEGER,
 updated_at TIMESTAMP WITHOUT TIME ZONE,
 created_at TIMESTAMP WITHOUT TIME ZONE,
 CONSTRAINT "DIDS_PK" PRIMARY KEY (scope, name),
 CONSTRAINT "DIDS_ACCOUNT_FK" FOREIGN KEY(account) REFERENCES accounts (account) ON DELETE CASCADE,

我想了解我面临的问题。 谢谢

【问题讨论】:

  • 查询的最后一行末尾有一个逗号。尝试删除它。
  • Nope:查询正确,触发错误信息时打印悬空逗号。您可能会注意到,第二个代码部分是第一个代码部分的摘录。
  • 您使用的是哪个版本的 CockroachDB?只要accounts.accountscopes.scope 具有独特的约束条件,在v19.1.4(最新稳定版)上运行上述语句即可。
  • 感谢您试用 Mark,我使用的是 cockroach 自己发布的容器中标准包装的版本。我得看看是哪一个!
  • cockroachdb/cockroach:latest docker 镜像始终指向最新的稳定版本,当前为 v19.1.4。您可以通过运行SELECT version(); 来检查节点的版本。

标签: sql psycopg2 cockroachdb


【解决方案1】:

您想在列定义中提及您的 FOREIGN KEY 引用,而不是使用单独的 CONSTRAINT 字段:

CREATE TABLE dids (
    scope VARCHAR(25) NOT NULL,
    name VARCHAR(250) NOT NULL,
    account VARCHAR(25) REFERENCES accounts (account) ON DELETE CASCADE,
...
);

见:https://www.cockroachlabs.com/docs/stable/foreign-key.html

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多