2010-12-13 4 views
1

У меня есть таблица, как что-то вроде ниже, я использую это, чтобы сохранить имя загружаемого изображения. Клиент хочет, чтобы изображение было {id}.{jpg|gif}.Как вставить запись со значением столбца в значение автоинкремента pk?

create table imgae(
id int autoincrement, 
image text 
) 

Как я могу вставить новую запись только с одним sql.

ответ

0

Вы не можете сделать это с помощью одного оператора SQL в MySQL. Если MySQL поддерживает последовательности Oracle-стиля, вы сможете сделать это в одном заявлении. Но поскольку auto_increment не даст вам следующий идентификатор до после, вставка была выполнена, вам нужно иметь строку, вставленную перед доступом к идентификатору. Ближайший вы можете получить в MySQL заключается в следующем:

insert into imgae (image) values (null); 
update imgae set image=concat(last_insert_id(), '.jpg') where id=last_insert_id(); 

BTW: Я вижу, ваша таблица называется imgae, который, вероятно, опечатка. Возможно, вы указали номер image? Кроме того, когда я попытался запустить ваш оператор create table, он потерпел неудачу. Я должен был сделать пару изменений, чтобы заставить его работать, чтобы я мог проверить свой ответ. Он должен выглядеть следующим образом:

create table imgae(id int auto_increment primary key, image text); 
+0

Да, это опечатка. Спасибо за ваш ответ. Фактически, я использую Symfony sfWidgetFormInputFileEditable, который, похоже, должен определить имя изображения перед запуском sql-вставки. Трудно иметь имя изображения с значением автоинкремента Pk. – xdazzyy

+0

@xdazzyy: Я понимаю, что удобно иметь pk в имени файла, и это, безусловно, возможно. Но IMO, это не стоит дополнительной сложности, которую вам придется добавить, чтобы заставить ее работать. Несомненно, это приятное, а не жесткое требование. Это? – Asaph

+0

Спасибо, Асаф. Но, к несчастью, это жесткое требование ... – xdazzyy

0

INSERT INTO "imgae" VALUES ("образ") (CONCAT (LAST ("ID") + 1,/* код сценария для извлечения расширения /))

+0

Я думаю, вы неправильно поняли вопрос. Ему нужна строка в таблице, где столбец «image» имеет автоматически сгенерированный первичный ключ как часть значения столбца (за которым следует '.gif' или' .jpg). Это своего рода проблема с курицей и яйцом. – Asaph

+0

Спасибо Асаф, я обнаружил, что тип изображения «текст» затем исправлен. –

+0

У этого же недостатка безопасности потока, как и ответ @Brian H. – Asaph

0
INSERT INTO imgae (image) VALUES (CONCAT(LAST_INSERT_ID() + 1, ".jpg")); 

Но это фактически не обозначает файл изображения. Вам нужно будет убедиться, что вы это сделаете после этого, используя mysql_inser_id(), чтобы получить это значение.

+0

Это не безопасный поток. Вы рискуете столкновениями, если одновременно выполняются несколько потоков, что может легко произойти в веб-приложении. Кроме того, 'LAST_INSERT_ID()' для каждого соединения, так что это будет работать, только если все вставки происходят в одном соединении с базой данных и что соединение никогда не закрывается. Как только вы снова откроете новое соединение, 'LAST_INSERT_ID()' вернет 'null'. – Asaph

+0

Спасибо, что указали это, Асаф. –

0

Кажется излишним хранить идентификатор в столбце, когда идентификатор уже находится в другом столбце. Почему бы не оставить id одинаковым и просто беспокоиться о сохранении расширения файла? (при условии, что {id}.{jpg|gif} - это все, что происходит в столбце, и было крайне неверно представлено как тип text). Затем запросите их и разделите идентификаторы и столбцы расширения, чтобы получить результат.

... или я что-то упустил