我正在处理一张有大约500万张唱片的桌子。我正在从csv文件中加载记录。
有一个独特的列,url。
在插入时,如果url已经在表中,我希望更改新的url值,然后执行插入。
示例:
url of "book"插入记录。如果book已经存在,那么新记录应该有一个url of "book-1" (然后是"book-2"等等)
"book-1","book-2"...之外,url值"book-1","book-2"...在表中。我发现有2种方式可以这么做。
插入每个记录之前的
url值是否已经存在;如果它存在,则对新的url值进行必要的更改并插入。我担心这将导致一个糟糕的performance.url值是否已经存在。如果url值已经存在,则处理"mysql #1062 -重复输入错误“并对url值进行所需的更改;重新尝试插入.。
这个是可能的吗?如果是这样的话,是怎么做的?
发布于 2012-02-20 14:14:32
如果这是一个一次性的问题,我想推荐一个临时的MySQL解决方案:
如果您的表不是MyISAM.
url_suffix.
url_suffix.
url列上的唯一约束。
url、url_suffix),并确保没有使用url_suffix.
url_suffix列现在是在url上键键的。因此,第一个特定的url将具有url_suffix of 1和next 2,等等。
查询以更新所有行:
UPDATE urls
SET url = if (url_suffix = 1, url, CONCAT(url, '-', url_suffix - 1))实际上,您可以跳过步骤6,保留auto_increment字段,这样以后您就可以轻松地添加重复的URL,只需像这样获取您的URL:
SELECT (if (url_suffix = 1, url, CONCAT(url, '-', url_suffix - 1))) AS url
FROM urls您的数据应该如下所示:
url url_suffix
---------------------------
that 1
that 2
this 1
this 2
this 3
those 1发布于 2012-02-20 13:35:18
这里有一个问题,一个简单的触发器在插入时会被证明是无效的,因为你说它们会从'book‘到'book-1’book-2‘等等。最简单的方法是有一个新列,其中包含一个默认值为0的数值。这可以在存储过程中完成,即
CREATE PROCEDURE `insertURL`(inURL VARCHAR(255))
BEGIN
DECLARE thisSuffix INT UNSIGNED DEFAULT 0;
// We have to get this ID first, as MySQL won't let you select from the table you are inserting to
SELECT COALESCE(MAX(url_suffix)+1,0) INTO thisSuffix FROM urls WHERE url_column = inURL;
// Now the ID is retrieved, insert
INSERT INTO urls (
url_column,
url_suffix
) VALUES (
inURL,
thisSuffix
);
// And then select the generated URL
SELECT IF(thisSuffix>0,CONCAT(inURL,'-',thisSuffix),inURL) AS outURL;
END然后使用以下方法调用
CALL insertURL('book');如果后缀为0,则返回“book”;如果后缀大于0,则返回“book-1”。
为了测试我的表设计
CREATE TABLE `urls` (
`url_column` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`url_suffix` tinyint(3) UNSIGNED NOT NULL ,
PRIMARY KEY (`url_column`, `url_suffix`)
);https://stackoverflow.com/questions/9361761
复制相似问题