我目前有一个名为Spreadsheet
的数据库,具有2291行,每行6列。
我也有一个.csv文件,其中有1000多行具有相同的6列,尽管其中三行默认设置为NULL
(与数据库中的某些数据相同,这意味着,某些数据默认设置为NULL太)。我试图将它们(不是replace
)导入到现有数据库中。
第一列是primary key
,我知道.csv和数据库都没有重复的主键。主键如下所示:0015000000b0Y2u
我的问题是:如何将这1000多行(它们自身带有唯一的primary keys
)导入到预先存在的2291行中,而不会出现#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自动递增,因为我已经研究过了,这不是我要寻找的解决方案。
我尝试更改重复的条目违规者密钥,但无济于事,出现同样的错误。有人可以帮我吗?
最佳答案
我怀疑问题在于您的主键是具有不区分大小写的排序规则(例如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
字符集和latin1_swedish_ci
归类,则可能要将列的归类更改为latin1_general_cs
或latin1_bin
。例如
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