将CREATE TABLE,ADD COLUMNS,PRIMARY KEY,AS SELECT和WHERE合并为一个操作

时间:2018-07-17 14:03:02

标签: python mysql python-2.7 mariadb

我需要创建一个表的副本(如果尚不存在),并且该副本需要现有列之一才能成为主键。

当前,我有以下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 ...命令结合使用,以便仅在需要创建表时才尝试设置主键?

EDIT
可以使用Python代码。

SQL:10.1.23-MariaDB
Python:2.7

2 个答案:

答案 0 :(得分:1)

即使来自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将为空。

答案 1 :(得分:0)

这不像纯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)")