2013-06-24 28 views
1

我期待在插入過程中在另一列中包含自動設置的自動增量。例如,在一個表,其中ID是自動增量和名稱是其他列,我想這樣做在MySQL中,如何在INSERT時使用另一列中的自動增量值?

`INSERT INTO Names (Name) VALUES (CONCAT("I am number ",ID));` 

目前,我做的INSERT沒有名字,那我也做一個更新後,立即使用$ mysqli-> insert_id。

我不想預先查詢表格,因爲儘管時間很短,但在獲取下一個自動增量值和插入之間可能會插入另一條記錄。一個觸發器可以工作,但它似乎是矯枉過正。我只想知道我是否可以在插入內引用自動增量。

非常感謝!

+0

我沒有試過,但如果你只是參考ID-它無法正常工作在您的INSERT查詢中按名稱輸入字段? –

+0

你嘗試過使用'TRIGGER'嗎? –

+0

JW,我已經閱讀過如何使用'TRIGGER'來做這件事,它看起來有點太「離INSERT」很遠。如果我不能在INSERT中,我會保留'UPDATE'。 安德魯,我曾經假定它是否會在自動增量之前或之後取值,因此我剛剛嘗試了它。也許我錯了。我得到了「我是0號」。自動增量數據的設置沒有發生。即使它做到了,我仍然擔心它可能在不同的SQL上以不同的方式工作。 –

回答

1

問題並不像看起來那麼容易。在BEFORE INSERT觸發器中,自動增量值尚未生成(NEW.autoinc_column0),並且在AFTER INSERT觸發器中,不可能再更改要插入的值。

MyISAM表,你可以檢查表定義下一個AUTO_INCREMENT值:

DELIMITER //  

    CREATE TRIGGER inserName BEFORE INSERT ON name FOR EACH ROW 
    BEGIN 
     DECLARE next_ai INT; 
     SELECT auto_increment INTO next_ai 
      FROM information_schema.tables 
      WHERE table_schema = DATABASE() AND table_name = 'name'; 
     SET NEW.name = CONCAT("I am number ", next_ai); 
    END // 

DELIMITER ; 

我相信這可能是與InnoDB表工作過,如果innodb_autoinc_lock_mode = 0(不是默認的情況下),但我不當然(由於可能的併發問題)。

但如果價值CONCAT是永遠不變的,你可能最好使用視圖,例如:

CREATE VIEW names_v AS SELECT id, CONCAT("I am number ", id) AS name FROM names; 
+0

YaK,謝謝你的深思。我不想使用'TRIGGER',因爲它看起來像你描述的那樣複雜。 (名稱並不總是相同的;我只是想給出一個初始值。) –

+0

事情是我不認爲這可以通過任何其他方式實現,但觸發器。或者,也許有一些像下面這樣複雜的東西:'INSERT INTO names(name)VALUE(CONCAT('I am number',SELECT auto_increment FROM information_schema.tables WHERE table_schema = DATABASE()AND table_name ='name'));';) – RandomSeed

+0

'name'不會總是一樣的,但它是確定性的嗎?視圖定義也可以像'CREATE VIEW names_v AS SELECT id,someCustomFunction(id)AS name FROM names;' – RandomSeed

相關問題