2013-05-09 47 views
6

我特林做到這一點複製表中的所有行和防止重複鍵

  • 獲取一個表名爲博客的所有行。
  • 複製他們在一個臨時數據庫
  • 編輯的這個臨時表中記錄的語言領域
  • 插入到博客表

而且我想這樣的:

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2; 
UPDATE tmptable SET lan = 1; 
INSERT INTO blogs SELECT * FROM tmptable; dump database tmptable; 

但corse我得到重複的關鍵錯誤...

如何防止它?

CNC中

我想:

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2; 
UPDATE tmptable SET lan = 1; 
ALTER TABLE tmptable DROP id; 
INSERT INTO blogs SELECT * FROM tmptable; dump database tmptable; 

但隨後Column count doesn't match value count at row 1

CNC中

我相信這會工作(它做到了,因爲我知道如何許多記錄存在)

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2; 
UPDATE tmptable SET lan = 1; 
UPDATE tmptable SET id = id + 1000; 
INSERT INTO blogs SELECT * FROM tmptable; 

但我該如何正確地做到這一點? (只設置主鍵(id的下一個avaliable自動增量值)(不包括PHP /一樣))

CNC中

也許這樣的事情???

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2; 
UPDATE tmptable SET lan = 1; 
UPDATE tmptable SET id = id + (SELECT id FROM blogs ORDER BY id DESC LIMIT 1); 
INSERT INTO blogs SELECT * FROM tmptable; 
+0

博客表的ID是身份? – TeKapa 2013-05-09 19:07:02

+0

其主鍵,獨特和自動增量。是! – 2013-05-09 19:14:32

+0

爲什麼不只是將您的INSERT語句更改爲使用ON DUPLICATE KEY UPDATE? – 2013-05-17 17:13:38

回答

4
CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2; 
UPDATE tmptable SET lan = 1; 
alter table tmptable drop column id; 
INSERT INTO blogs SELECT NULL,tmptable.* FROM tmptable; 

假設列「id」是第一列。

+0

我喜歡這個:) – 2013-05-12 12:08:20

0
UPDATE blogs SET lan = 1 WHERE lan = 2; 

只需運行在您的原始表查詢。

我不想更改語言,我想保存的 所有記錄另一個副本和ASIGN這個副本不同的語言

在這種情況下,從刪除主鍵你臨時表。當您插回行時,請不要包含主鍵列:

INSERT INTO blogs (title, lan) SELECT * FROM tmptable; 
+1

NOOOOOO ....我不想改變語言,我想保存所有記錄的另一個副本,併爲此複製不同的語言 – 2013-05-09 18:47:11

12

不需要臨時表。

INSERT INTO blogs (lan, col1, col2, col3, ...) 
SELECT 1, col1, col2, col3, ... 
FROM blogs 
WHERE lan = 2 

更換col1, col2, col3, ...與除lanid所有列的列表。

+0

這應該工作! – TeKapa 2013-05-09 19:18:24

+1

問題是你需要有所有的領域的軌道.. – 2013-05-10 17:54:14

+2

這是你必須經常做的事嗎?你的表格模式變化很大嗎?如果是這樣,您可以編寫一個存儲過程,從information_schema動態生成SQL。 – Barmar 2013-05-10 19:06:08

0

使用事先準備好的聲明,你可以查詢您要使用,然後僞造要執行查詢的列中的信息架構:

這裏的例子爲您的情況:

-- first query all the blogs column minus id and lan 

SELECT GROUP_CONCAT(c.COLUMN_NAME) 
INTO @cols 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE 
c.TABLE_NAME = 'blogs' 
AND c.COLUMN_NAME not in ('id', 'lan'); 

-- second build the query with the gathered columns 
-- like INSERT INTO blogs(lan, col1, ...) SELECT 2, col1, ... FROM blogs WHERE lan=1 

SET @sql=CONCAT(CONCAT(CONCAT(CONCAT('INSERT INTO blogs (lan,', @cols), 
       ') SELECT 2,'), @cols), ' FROM blogs WHERE lan=1'); 

-- prepare the statement  
PREPARE stmt FROM @sql; 

-- and last run the insert 
EXECUTE stmt; 
1

請嘗試下面的sql。類似SQL FIDDLE

CREATE TEMPORARY TABLE tmptable SELECT * FROM blogs WHERE lan = 2; 
    UPDATE tmptable SET lan = 1; 
    UPDATE tmptable SET id = (select @val:[email protected]+1 from(select @val:=(select max(id) from blogs)) t) 
    INSERT INTO blogs SELECT * FROM tmptable; 

希望這會有所幫助。