将create table、add columns、primary key、as select和where合并到一个操作中

csbfibhn  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(339)

我需要创建一个表的副本(如果它还不存在的话),这个副本需要一个现有的列成为主键。
目前我有以下sql命令(在python脚本中):

CREATE TABLE IF NOT EXISTS FilteredTable AS SELECT * FROM RawTable WHERE <cond>

ALTER TABLE FilteredTable ADD COLUMN IF NOT EXISTS (NewCol1 TEXT, etc TEXT)

ALTER TABLE FilteredTable ADD PRIMARY KEY (ColumnNameFromRaw)

这在第一次运行时效果很好,但是当在表已经存在之后再次运行时,它会抱怨主键已经存在。有没有办法把 ADD PRIMARY KEYCREATE TABLE ... 命令,以便仅在需要创建表时尝试设置主键?
编辑
可以使用python代码。
sql:10.1.23-mariadb
python:2.7版

a8jjtwal

a8jjtwal1#

可以在中添加额外的列和索引 CREATE TABLE 即使是来自 SELECT . 所以一步到位:

CREATE TABLE IF NOT EXISTS FilteredTable (
    NewCol1 TEXT, etc TEXT,
    PRIMARY KEY (ColumnNameFromRaw)
) AS SELECT * FROM RawTable WHERE <cond>

注意:列名是按名称匹配的。也就是说,如果 * 有一个 NewCol1 ,它将进入 TEXT 列。如果没有,那么 NewCol1 将为空。

g0czyy6m

g0czyy6m2#

这并不像纯sql解决方案那么干净,但是如果您像这样间接地访问sql,它就会起作用。。。


# ...

# (New table creation)

# ...

# Display column data for specified table

curs.execute("SHOW COLUMNS FROM NewTable")

# Collect the data as a tuple of tuples containing chart rows

colsNew = curs.fetchall()

# Iterate through each table column (row in the chart)

for col in colsNew:
    # Check to see if Key is not "PRI" for the Field (Column) "DesiredColumn"
    if (col[0] == "DesiredColumn") and (col[3] != "PRI"):
        # Make DesiredColumn the primary key
        curs.execute("ALTER TABLE NewTable ADD PRIMARY KEY (DesiredColumn)")

相关问题