在 Redshift 'CREATE TABLE AS' 查询中指定数据类型

Posted

技术标签:

【中文标题】在 Redshift \'CREATE TABLE AS\' 查询中指定数据类型【英文标题】:Specify Data Types in Redshift 'CREATE TABLE AS' Query在 Redshift 'CREATE TABLE AS' 查询中指定数据类型 【发布时间】:2016-04-21 13:24:45 【问题描述】:

在进行 Redshift CREATE TABLE AS 查询时,有没有办法指定数据类型并保持约束?

在下面的示例中,我希望能够创建 table1 的副本,其中列 column2NVARCHAR(500) 类型而不是 VARCHAR(255) 并保留 column1 NOT NULL 约束。

CREATE TABLE test.table1 (column1 INT NOT NULL, column2 VARCHAR(255));

INSERT INTO test.table1
SELECT 1,'foo';

CREATE TABLE test.table2 AS
SELECT column1,CAST(column2 AS NVARCHAR(500))
FROM test.table1;
/* query executes successfully but still creates column2 as VARCHAR(255) and column1 is NULLABLE.  */

CREATE TABLE test.table2 (
    column1 INT NOT NULL
    ,column2 NVARCHAR(500)
    ) AS
SELECT column1
    ,column2
FROM test.table1;
/* ERROR: 42601: syntax error at or near "as" */

编辑:我知道我可以通过使用正确的数据类型和约束显式创建 test.table2,然后使用 test.table1 中的数据执行 INSERT 语句分两步完成此操作.我很好奇这是否可以在一个 CREATE TABLE AS 查询中完成。任何解决方法或提示将不胜感激! :)

【问题讨论】:

【参考方案1】:

从 SQL 的角度来看,答案是 Yes 和 No。是的,您可以指定数据类型:使用 CAST 将列转换为您想要的类型。不,你不能指定约束,因为你不能:没有语法可以做到这一点。

如果您担心表的约束,请将其作为架构的一部分。如果数据动态地确定模式,则有问题。

【讨论】:

以上是关于在 Redshift 'CREATE TABLE AS' 查询中指定数据类型的主要内容,如果未能解决你的问题,请参考以下文章

通过阅读 Python 中的 Oracle DDL 语句为 Redshift 创建 Create Table 语句

哪个在 redshift 中性能更高 - 截断后跟 Insert Into 或 Drop and Create Table As?

AWS Glue 数据从 S3 迁移到 Redshift

Redshift 中的 CREATE SCHEMA 无法创建架构

Psycopg2 是不是允许使用 Python 在 redshift 上运行 udf create 查询?

Amazon Redshift CREATE FUNCTION ERROR: 42601: 在“默认”或接近“默认”时出现语法错误