0

我目前有一个名为Spreadsheet2291 行的数据库,每行有 6 列。

我还有一个 .csv 文件,其中包含 1000 多个具有相同 6 列的行,尽管其中三个被设置为默认值NULL(与我数据库中的一些数据相同,这意味着,一些也被设置为 NULL 作为默认值)。我试图将它们(不是replace)导入现有数据库。

第一列是primary key,我知道 .csv 和数据库都没有重复的主键。主键看起来像这样:0015000000b0Y2u

我的问题是:如何在primary keys不出现 #1062 错误的情况下将这 1000 多行(它们本身具有唯一性)导入到预先存在的 2291 行中?

SQL query:

INSERT INTO  `Spreadsheet` (  `accountID` ,  `accountName` ,  `website` ,  `rating` ,  `imageURL` ,  `comments` ,  `category` ) 
VALUES (

'0015000000b0Y3z',  'Kittredge and Associates Inc',  'kittredgeandassociates.com', NULL ,  'kittredgeandassociates.com.jpg', NULL , NULL
)
MySQL said: 

#1062 - Duplicate entry '0015000000b0Y3z' for key 'PRIMARY' 

上面附上的是我收到的 #1062 错误,尽管我 100% 确定我没有PRIMARY.

我不想让 mySQL 自动增量,因为我已经研究过了,这不是我正在寻找的解决方案。

我曾尝试更改重复的条目违规者密钥,但无济于事,同样的错误。有人可以帮帮我吗?

4

2 回答 2

3

我怀疑问题在于您的主键是一个字符列,其排序规则不区分大小写(例如latin1_swedish_ci)。如果是这样,小写和大写字母被认为是“相等的”,这将导致重复。

这是一个演示。注意 collat​​ion_name 值的不同:

CREATE TABLE t3 (mycol VARCHAR(4) COLLATE latin1_swedish_ci PRIMARY KEY );
INSERT INTO t3 VALUES ('A'),('a');

-- Error Code: 1062
-- Duplicate entry 'a' for key 'PRIMARY'

CREATE TABLE t4 (mycol VARCHAR(4) COLLATE latin1_bin PRIMARY KEY );
INSERT INTO t4 VALUES ('A'),('a');

-- 2 row(s) affected

如果您需要 MySQL 认为大写和小写字母不相等,那么您需要为该列指定区分大小写或二进制排序规则,而不是不区分大小写的排序规则。

(注意:MySQL 名称排序规则不区分大小写,_ci排序规则名称末尾带有 a,例如latin1_swedish_ci.)

如果列当前是latin1字符集和latin1_swedish_ci排序规则,您可能希望将列上的排序规则更改为latin1_general_csor 或latin1_bin

例如

ALTER TABLE t3 CHANGE mycol mycol VARCHAR(4) COLLATE latin1_general_cs ;

http://dev.mysql.com/doc/refman/5.5/en/case-sensitive.html

http://dev.mysql.com/doc/refman/5.5/en/adding-collat​​ion.html

于 2013-01-02T20:21:52.633 回答
0

Not sure how you would get this error if you are correct that the PK and any other unique indexes are not being violated. A solution might be to use ON DUPLICATE KEY UPDATE or the IGNORE keyword.

于 2013-01-02T20:11:31.157 回答