Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:使用AI主键和重复键更新加载数据填充_Mysql_Sql_Csv - Fatal编程技术网

MySQL:使用AI主键和重复键更新加载数据填充

MySQL:使用AI主键和重复键更新加载数据填充,mysql,sql,csv,Mysql,Sql,Csv,我找到了一个正确的解决方案,在MySQL中加载数据填充可以在重复密钥更新时使用。以下是我使用的代码(从堆栈溢出中获取): 上面的代码工作正常,可以使用仅具有不同ID的新记录更新表。但是,当主键为自动递增(AI)时,它无法工作。它表明以下代码不能在自动递增主键上运行 DROP INDEX `PRIMARY` ON temporary_table 以下是错误消息: #1075 - Incorrect table definition; there can be only one auto colu

我找到了一个正确的解决方案,在MySQL中加载数据填充可以在重复密钥更新时使用。以下是我使用的代码(从堆栈溢出中获取):

上面的代码工作正常,可以使用仅具有不同ID的新记录更新表。但是,当主键为自动递增(AI)时,它无法工作。它表明以下代码不能在自动递增主键上运行

DROP INDEX `PRIMARY` ON temporary_table
以下是错误消息:

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

我很困惑,因为如果我不使用自动增量,它会运行得很好。有人知道如何解决这个问题吗?提前感谢。

有两个步骤

1) 你的问题解决方案

mysql> DROP INDEX `PRIMARY` ON test5;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> show create table test5;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                             |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test5 | CREATE TEMPORARY TABLE `test5` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table test5 modify `id` int(11) NOT NULL;
Query OK, 0 rows affected (0.21 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> DROP INDEX `PRIMARY` ON test5;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> show create table test5;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                        |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test5 | CREATE TEMPORARY TABLE `test5` (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `address` varchar(100) DEFAULT NULL,
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2) 最佳解决方案

在这个过程中,我们可以用下面的单个查询替换第一个(两个步骤)

1) 2)我们可以创建具有相同引用结构且没有任何索引的新表

CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1=0;
而不是

1) 创建一个新的临时表

CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2) (可选)从临时表中删除所有索引以加快速度

SHOW INDEX FROM temporary_table; DROP INDEX PRIMARY ON temporary_table; DROP INDEX some_other_index ON temporary_table;
你也可以参考下面的链接

SHOW INDEX FROM temporary_table; DROP INDEX PRIMARY ON temporary_table; DROP INDEX some_other_index ON temporary_table;