【问题标题】:Combine CREATE TABLE, ADD COLUMNS, PRIMARY KEY, AS SELECT, and WHERE into one operation将 CREATE TABLE、ADD COLUMNS、PRIMARY KEY、AS SELECT 和 WHERE 组合到一个操作中
【发布时间】:2018-07-17 14:03:02
【问题描述】:

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

目前我有以下 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

【问题讨论】:

  • 在不使用存储过程和/或一些动态 SQL 的情况下,您似乎无法做到这一点。 See here 一些选项。
  • 该死。好的,谢谢。除了畏缩因素之外,发生该错误是否有任何危害?
  • 实际上,如果它失败并且没有做任何事情,并带有令人讨厌的错误消息,那是 IMO 更好的结果。根据我的阅读,它实际上可能会创建另一个索引,而您可能不希望在生产中发生这种情况。
  • 是的,我最不想要的就是在使用多年后不知何故拥有数千个主键实例......
  • 我认为最好先检查表是否存在select * from information_schema.tables where table_schema="db_name" and table_name="FilteredTable",如果不存在则创建主键。

标签: python mysql python-2.7 mariadb


【解决方案1】:

即使来自SELECT,您也可以在CREATE TABLE 命令中添加额外的列和索引。所以一步完成:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2016-04-26
      • 2012-06-25
      • 2010-11-27
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2012-11-16
      • 2021-01-15
      相关资源
      最近更新 更多