PHP Mysql увеличивает столбец во время вставки - PullRequest
2 голосов
/ 10 мая 2011

Извините, позвольте мне попытаться объяснить .... автоинкременты recordID и это мой первичный ключ ..... LISTINGID относится к идентификатору в другой таблице.В этой таблице 1 необходимо увеличивать recordListingID для каждой записи, имеющей одинаковый LISTINGID.Мой оператор вставки вставляет до 10 записей, имеющих одинаковый LISTINGID. Мне нужно, чтобы recordListingID начинался с 1. И т. Д.1 или более записей Мне нужно увеличить одно из столбцов, причем первая запись равна 1, вот мой код вставки

mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '??', '$listingid')");

, куда я положил ??это col, которое нужно увеличить.Как мне этого добиться?

Заранее спасибо!

Ответы [ 7 ]

2 голосов
/ 10 мая 2011

Вы можете использовать встроенную функцию Auto_Increment MySql

  AUTO_INCREMENT

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

MySql будет увеличивать указанное поле на 1 (или любой интервал, который вы установите)

1 голос
/ 10 мая 2011

Вы можете использовать пользовательские переменные

0 голосов
/ 11 ноября 2011

Я думаю, я знаю, что вы пытались достичь.возможно, есть лучший способ, но я выбрал «выбрать max (id) +1 как nextId из таблицы» и сохранить его в переменной, которую я использовал в дополнительном поле id, которое вы назвали «recordListingID».

таким образом, первая строка, которую вы вставите, будет иметь тот же идентификатор и recordListingID, но каждая другая строка будет автоматически идентифицировать идентификатор, но recordListingID будет таким же, как и первая.

в моей ситуации, только один пользователь делает это за раз, поэтому нет вероятности ошибок, но в многопользовательской ситуации вы можете изменить это, чтобы не упустить людей, выполняющих вставкив то же время.например, отметив последнюю строку, чтобы ваш запрос знал, что он завершен, чтобы вы могли что-то вроде «выбрать max (id) +1 как nextId из таблицы, где lastRow = 1» или что-то в этом роде.

0 голосов
/ 10 мая 2011

Предисловие: Если вам нужно иметь 2 поля, которые увеличиваются, но не связаны друг с другом, вы, вероятно, делаете это неправильно.Возможно, лучше не иметь recordListingID, а вместо этого просто использовать recordID, так как они, вероятно, будут иметь одинаковое число.

Если в ваших таблицах работает InnoDB, вы можете создавать транзакции.Тогда вы можете попробовать что-то вроде этого:

<?php

mysql_query('START TRANSACTION');

$recordListingId = mysql_result(mysql_query("SELECT count(*)+1 as num FROM car_listing_images WHERE LISTINGID=$listingid"), 'num', 0);

mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '$recordListingId', '$listingid')");

mysql_query('COMMIT');
?>

Если у вас нет innodb, попробуйте использовать хранимую процедуру .

0 голосов
/ 10 мая 2011

Вы можете инициализировать переменную как 1 и использовать оператор постинкремента :

$value = 1;
for(...){
    $sql = 'INSERT ...';
    $value++;
}
0 голосов
/ 10 мая 2011

Измените структуру таблицы так, чтобы она включала атрибут AUTO_INCREMENT для столбца recordListingID, затем пропустите столбец из вставки, чтобы он автоматически заполнялся инкрементным числом.

I.e: mysql_query ("INSERT INTO car_listing_images (recordID, recordText, LISTINGID) VALUES ('', '$ fileName', '$ listid')");

0 голосов
/ 10 мая 2011

Не знаю, действительно ли я понимаю ваш вопрос.

Если вы хотите увеличивать столбец с каждой записью, он должен быть определен как AUTO_INCREMENT столбец. Таким образом, в вашем операторе INSERT, если вы вставите NULL в этот столбец, он будет увеличиваться каждый раз.

В качестве альтернативы вы можете сделать fieldname+1, но AUTO_INCREMENT всегда предпочтительнее.


Согласно моему комментарию, вы можете сделать что-то вроде этого:

$row = mysql_fetch_assoc(mysql_query("SELECT MAX(recordListingID) AS `max` FROM car_listing_images"));
$next_id = $row['max'] + 1;
mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '$next_id', '$listingid')");

Я бы все же серьезно рекомендовал против этого, это намного лучше лучшая реализация для использования поля AUTO_INCREMENT.


После вашего последнего комментария я бы предложил следующее. Вы не сможете сделать это в MySQL напрямую (если только вы не используете переменную, но это может пойти не так, если вы тоже вставляете несколько RecordID).

$next_id = 0;
foreach ($insert as $insert_stmt) {
    $next_id++;
    mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '$next_id', '$listingid')");
}
...