我需要创建一个表的副本(如果尚不存在),并且该副本需要现有列之一才能成为主键。
当前,我有以下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 KEY
与CREATE TABLE ...
命令结合使用,以便仅在需要创建表时才尝试设置主键?
EDIT
可以使用Python代码。
SQL:10.1.23-MariaDB
Python:2.7
答案 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)")