2013-03-13 3 views
3

У меня есть таблица с 2 столбцами. Столбец идентификатора автоматически увеличивается. Я пытаюсь автоматически увеличивать пользовательский столбец с тем же идентификатором, что и столбец id, но с префиксом «пользователь» (пример: user100, где идентификатор также равен 100), в основном так же, как то, что делается в stackoverflow.auto increment second column

CREATE TABLE test_table (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    user CHAR(30) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM; 

Есть ли способ сделать это в 1 запросе? Вместо того, чтобы вставлять в БД, затем запрашивать, чтобы получить идентификатор, и вставить идентификатор в столбец пользователя?

+4

почему ты нужно дублировать его (и он ** дублирует)? –

+0

Char can not auto incremented ... –

+0

только Интс может быть автоматически Приращение –

ответ

1

Вы можете сделать триггер

Перед Trigger:

mysql> truncate table test_table; 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter $$ 
mysql> CREATE TRIGGER test_table_trigger 
    -> BEFORE insert ON test_table 
    -> FOR EACH ROW 
    -> BEGIN 
    -> SET new.user = CONCAT('user', (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='test_table')); 
    -> END $$ 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
mysql> INSERT INTO test_table values(); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> INSERT INTO test_table values(); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> INSERT INTO test_table values(); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> select * FROM test_table; 
+----+-------+ 
| id | user | 
+----+-------+ 
| 1 | user1 | 
| 2 | user2 | 
| 3 | user3 | 
+----+-------+ 
3 rows in set (0.00 sec) 

выше, то следует использовать автоматическое приращение после его прочили на id колонку и добавить его в строку user. Идентификатор автоматического увеличения увеличивается с Information_Schema, как если бы это было в транзакции или во многих запросах, это может быть неправильно.

+0

не должен __AFTER__ INSERT быть UPDATE, а не INSERT снова? – Waygood

+0

Это приведет к ошибке «дубликат ключа», поскольку триггер попытается вставить другую запись с тем же идентификатором. – Jocelyn

+0

Обновлено до, используя LAST_INSERT_ID(), который определен на предыдущем этапе. –

0

Может быть, вы можете попробовать это, подбирая последний вставленный идентификатор и конкатенацию строку с преобразованным значением:

INSERT INTO test_table (user) VALUES ('user') 

UPDATE test_table 
SET user = user + CAST(LAST_INSERT_ID() AS VARCHAR) 
WHERE id = LAST_INSERT_ID() 
+0

Пока эти операторы выполняются вместе в одном и том же соединении, это безопасно для параллелизма. – cfeduke

+0

thats 2 вопроса. это можно сделать в 1? –

+0

Возможно, вы можете использовать MAX (id) в подзапросе, в инструкции INSERT, считая, что данные не были удалены, и нет никакого пробела между ID – veljasije

2

используйте устройство ДО запуск:

DELIMITER $$ 
CREATE TRIGGER test_table_trigger 
BEFORE INSERT ON test_table 
FOR EACH ROW BEGIN 
    SET NEW.`user` = CONCAT(NEW.`user`, NEW.id); 
END $$ 
DELIMITER ; 

Документация: MySQL triggers

+0

im, получающим эту ошибку # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 5 –

+0

«пользователь» кажется зарезервированным словом. Я обновил код (я добавил обратные ссылки вокруг «пользователь»). – Jocelyn

+0

hmm, все та же ошибка –