2016-09-08 4 views
0

Скажем, у меня есть таблица, которая выглядит следующим образом:Использование столбца идентификации в струнной CONCAT во время операции вставки

CREATE TABLE Foo (
    fooSn INT NOT NULL AUTO_INCREMENT, 
    fooId VARCHAR(64) NOT NULL, 
    PRIMARY KEY (fooSn) 
) 
ENGINE=InnoDB 
ROW_FORMAT=DYNAMIC; 

И я хочу сделать что-то вроде этого:

CREATE PROCEDURE insertWithAutoId (
    p_myPrefix VARCHAR(32) NOT NULL, 
) 
BEGIN 
    INSERT INTO Foo 
     (fooSn, fooId) 
    VALUES 
     (DEFAULT, CONCAT(p_myPrefix, DEFAULT)); 
END 

Это возможное?

+1

Если вам действительно нужно это, это один из способов сделайте это http://stackoverflow.com/a/17894239/1920232 – peterm

+0

Это сложно, но это работает! Спасибо за головы, но я не думаю, что поеду по этому маршруту. – IsenGrim

+0

Я рассмотрел требование сохранения столбца 'fooId' в качестве конкатенации префикса строки и значения, возвращаемого с AUTO_INCRMENT. В качестве альтернативы рассмотрим сохранение префикса в отдельном столбце. И если вам нужны два столбца, объединенные (объединенные), используйте выражение в списке SELECT запроса, который ему нужен. НО ... мы не хотели бы использовать выражение CONCAT() в предикате (т. Е. В условии в предложении WHERE.) – spencer7593

ответ

1

Нет. Нельзя ссылаться на значение, назначенное столбцу AUTO_INCREMENT в инструкции INSERT, которая добавляет строку. Значение не доступно в инструкции. Он также недоступен в триггере BEFORE INSERT.

Возможно, возникнет соблазн создать триггер AFTER INSERT, чтобы присвоить значение столбцу fooId на основе значения, присвоенного столбцу AUTO_INCREMENT fooSn. Но для этого потребуется UPDATE строки, которая была только что вставлена, и вы обнаружите, что если вы попытаетесь сделать это в триггере AFTER INSERT, MySQL повысит ошибку 1442.