【问题标题】:In Redshift, how do you add multiple constraints to a table after creating the table?在 Redshift 中,如何在创建表后给表添加多个约束?
【发布时间】:2018-06-13 03:49:09
【问题描述】:

在 Redshift 中,有没有办法为已经创建的表添加多个约束?

第一步,创建表(比如一个月前)

CREATE TABLE test_user 
(
account_id          BIGINT DEFAULT NULL encode mostly32,
ingest_timestamp    BIGINT DEFAULT NULL ENCODE mostly32,
ingest_date         TIMESTAMP DEFAULT NULL ENCODE delta32k,
user_id             BIGINT NOT NULL encode mostly32,
group_id            BIGINT NOT NULL encode mostly32,
department_id       BIGINT NOT NULL encode mostly32,
name                VARCHAR(255) DEFAULT NULL ENCODE LZO,
mobile              VARCHAR(15) DEFAULT NULL ENCODE LZO,
phone               VARCHAR(15) DEFAULT NULL ENCODE LZO,
user_language       VARCHAR(15) DEFAULT NULL ENCODE runlength,
deleted             INT DEFAULT NULL ENCODE mostly8,
created_at          TIMESTAMP DEFAULT NULL ENCODE delta32k,
updated_at          TIMESTAMP DEFAULT NULL ENCODE delta32k,
PRIMARY KEY (user_id)
)
sortkey (account_id)

第二步,创建更多表,例如“test_group”、“test_department”

第三步,一个月后,我打算像这样向“test_user”表添加多个约束(但在单独的查询中)

ALTER TABLE test_user ADD CONSTRAINT FK_1 FOREIGN KEY (group_id) REFERENCES test_group (group_id); 
ALTER TABLE test_user ADD CONSTRAINT FK_1 FOREIGN KEY (department_id) REFERENCES test_department (department_id); 

以上成功。

但是,有没有办法在单个查询中添加多个约束? 试过这样,

选项 1 -> ALTER TABLE test_user ADD CONSTRAINT FK_1 FOREIGN KEY (group_id) REFERENCES test_group (group_id),ADD CONSTRAINT FK_1 FOREIGN KEY (department_id) REFERENCES test_department (department_id);

选项 2 -> ALTER TABLE test_user ADD CONSTRAINT FK_1 FOREIGN KEY (group_id) REFERENCES test_group (group_id), FK_1 FOREIGN KEY (department_id) REFERENCES test_department (department_id);

但在这两种情况下都出现了这个错误,

An error occurred when executing the SQL command:
ALTER TABLE test_user ADD CONSTRAINT FK_1 FOREIGN KEY (group_id) REFERENCES test_group (group_id), FK_2 FOREIGN KEY (department_id) REFERENCES test_department (department_id); REFERENCES helpdesk_user (user_id)

ERROR: syntax error at or near "FK_2"

有没有办法给已经创建的表添加多个约束? 请帮忙

【问题讨论】:

    标签: foreign-keys amazon-redshift alter-table multiple-tables


    【解决方案1】:

    什么时候定义它们都没有关系,或者即使你根本没有定义它们。

    Redshift 忽略约束。定义它们没有任何效果,除了优化器可能在创建访问计划时将它们用作附加信息。

    但是,我在 redshift 中创建并使用了海量(数十亿行)数据库,并且我没有定义任何类型的单一约束,而且运行速度非常快。

    回答:不要打扰。

    【讨论】:

    • 感谢您的回答@Bohemian。我知道 Redshift 对约束没有影响。最重要的是,我希望添加约束,因为我计划将 Redshift 外包给将访问我的集群的第三方。在那个注释中,我想添加约束(为了名字起见)。因此,我们有没有其他方法来多重添加约束?
    【解决方案2】:

    ALTER TABLE documentation 并不表示可以在一个语句中指定多个约束:

    ALTER TABLE table_name
    {
    ADD table_constraint |
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] |
    OWNER TO new_owner |
    RENAME TO new_name |
    RENAME COLUMN column_name TO new_name |
    ADD [ COLUMN ] column_name column_type
    [ DEFAULT default_expr ]
    [ ENCODE encoding ]
    [ NOT NULL | NULL ] |
    DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] }
    
    where table_constraint is:
    
    [ CONSTRAINT constraint_name ]
    { UNIQUE ( column_name [, ... ] )  |
    PRIMARY KEY ( column_name [, ... ] ) |
    FOREIGN KEY (column_name [, ... ] )
    REFERENCES  reftable [ ( refcolumn ) ]}
    

    另一方面,Redshift Pitfalls And How To Avoid Them 对约束对 Redshift 查询的影响进行了有趣的检查(请参阅“注意约束”部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多