代码之家  ›  专栏  ›  技术社区  ›  Ctrl S

将创建表、添加列、主键、as select和where组合到一个操作中

  •  0
  • Ctrl S  · 技术社区  · 8 年前

    我需要创建一个表的副本(如果它不存在的话),并且这个副本需要一个现有的列成为主键。

    目前我有以下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 ... 命令,以便它只在需要创建表时尝试设置主键?

    编辑
    可以使用python代码。

    SQL:10.1.23-马里亚布
    蟒蛇:2.7

    2 回复  |  直到 8 年前
        1
  •  1
  •   Ctrl S    8 年前

    您可以在 CREATE TABLE 即使来自 SELECT . 所以一步一个脚印地完成这一切:

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

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

        2
  •  0
  •   Ctrl S    8 年前

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