我目前有一个名为Spreadsheet
的数据库,有2291行,每行有6列。
我还有一个.csv文件,其中1000多个行具有相同的6列,但其中三个默认设置为NULL
(与我的数据库中的某些数据相同,这意味着,有些是默认设置为NULL)。我试图将它们(不是replace
)导入现有数据库。
第一列是primary key
,我知道.csv和数据库都没有重复的主键。主键看起来像这样:0015000000b0Y2u
我的问题是:如何在预先存在的2291行中导入这1000多行(它们自带唯一的primary keys
)而不会出现#1062错误?
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自动增量,因为我已经研究过了,这不是我想要的解决方案。
我已尝试更改重复的条目罪犯密钥,但无效,同样的错误。有人可以帮我一把吗?
答案 0 :(得分:3)
我怀疑问题是您的主键是具有不区分大小写的排序规则的字符列(例如latin1_swedish_ci
)。如果是这样,小写字母和大写字母被认为是“相等”,这将导致重复。
这是一个演示。请注意collation_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
的排序规则,例如latin1_swedish_ci
。)
如果列目前是latin1
characterset和latin1_swedish_ci
排序规则,您可能希望将列上的排序规则更改为latin1_general_cs
或latin1_bin
。
e.g。
ALTER TABLE t3 CHANGE mycol mycol VARCHAR(4) COLLATE latin1_general_cs ;
http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html
http://dev.mysql.com/doc/refman/5.5/en/adding-collation.html
答案 1 :(得分:0)
如果您没有违反PK和任何其他唯一索引,那么不确定如何获得此错误。解决方案可能是使用ON DUPLICATE KEY UPDATE或IGNORE关键字。