2012-02-03 49 views
2

我有兩個表有一個額外的變量

Table A 
(
unique id, -- sum of the records 
Data1, 
Data2 
) 

Table B 
(
Data1, 
Data2 
) 

我需要從表B中插入表格A和添加記錄我做了一個簡單的插入這樣的插入到表從另一個表:

Insert into A select * from B 

但由於唯一ID,這不起作用。

我想是這樣的:

INSERT INTO A 
SELECT 1+SELECT MAX(UniqueID) FROM A,temp.* 
FROM B temp; 

但是,這是行不通的。任何人都可以想到一種方法,我可以將第一個參數作爲記錄的計數,顯然每次添加新記錄時都需要增加一個參數。

+0

什麼錯誤? – 2012-02-03 14:18:26

+0

是一個自動遞增的ID?那麼你不需要設置它。然後,只需'插入到選擇data1,data2從B' – 2012-02-03 14:19:15

+0

錯誤是未知的表,它突出顯示臨時*。但是,如果我單獨做一個選擇*從溫度,然後它的工作,所以表似乎很好。 – Stefan 2012-02-03 14:34:32

回答

1

只需設置id是在表聲明自動增量列:

create table A (
    id int primary key auto_increment, 
    Data1 <sometype>, 
    Data2 <sometype> 
); 

然後你可以從B插入行:

insert into A (Data1, Data2) 
select Data1, Data2 from B 

A每一個新的行會得到一個新的,唯一的自動增量值爲id


注意:沒有經驗的plsql,但這是我會用MySQL做什麼。

+0

原始表格已經創建,不確定我會被允許將其更新爲自動增量,儘管它可能應該是一開始。有另一種方法嗎? – Stefan 2012-02-03 14:36:00

+0

@SteveTaylor - 在這種情況下,@@ Hadmacker的答案可能會更有幫助。 – 2012-02-03 14:40:38

1

在過去的Oracle數據庫的,我已經使用了序列創建表A中的主鍵ID,所以你應該能夠做到這一點:

CREATE SEQUENCE A_SEQ 
MINVALUE 1 
MAXVALUE 999999999999999999999999999 
START WITH 1 
INCREMENT BY 1 
CACHE 20;  

insert into A (id, Data1, Data2) select A_SEQ.nextval, Data1, Data2 from B 

看到此URL,獲取詳細信息。http://www.techonthenet.com/oracle/sequences.php

**在SQL Server中,您可以使用列上的「自動增量」屬性來執行相同操作。 ** SQL Server 2012也將獲得類似的Sequence機制,儘管它的語法與此完全不同。

**編輯:我的選擇是仍然使用序列,但作爲替代,你原來的SELECT語句的這種再工作可能會有所幫助:已經產生

INSERT INTO A (UniqueID, Data1, Data2) 
SELECT 
    (SELECT MAX(UniqueID) + 1 FROM A) 
    , Data1 
    , Data2 
FROM B 
+0

這是生成ID的一種很酷的方式。 – 2012-02-03 14:27:54

+0

這看起來不錯 - 有沒有一種方法可以將minvalue設置爲當前行的總數?我嘗試MINVALUE MAX(uniqueID)FROM A,但它抱怨說這是一個無效的數字。我看了一下這個鏈接,但他們似乎沒有涉及它。 – Stefan 2012-02-03 14:39:43

+0

不幸的是,你將無法以序列的方式使用最小/最大值。當你打電話給nextval時,你會收到一個唯一的號碼,它永遠是序列中的下一個號碼,永遠不會再被調用。 (反向回滾等會導致ID跳過)如果您需要始終有一個順序ID,您可能需要查看一個「BEFORE INSERT TRIGGER」,以便在沒有ID的情況下正常插入,並且在插入之前,觸發器將爲您執行SELECT MAX(ID)...位。你可以在這裏看到一個例子,儘管他們仍然在序列中使用它:http://www.datanamic.com/support/autoinc-oracle.html – Hadmacker 2012-02-03 15:18:47