Увеличение столбца таблицы для ввода заказа

#php #mysql #methods

#php #mysql #методы

Вопрос:

У меня есть таблица, в которой хранятся заказы.
идентификатор (автоматическое увеличение) oid (не автоматически увеличивается), а затем детали заказа.
в некоторых заказах может быть несколько записей, поэтому у меня есть ID и Oid (идентификатор заказа), поэтому, если вы заказываете 3 xwidgets и 4Zwidgets, они попадают под один и тот же OID

Я использую следующий код, чтобы назначить следующий номер OID, и мне интересно, лучший ли это способ:

 $maxquery = mysql_query("SELECT MAX(oid) FROM ordr") or die(mysql_error());
$maxresult = mysql_fetch_array($maxquery);
$maxid = $maxresult['MAX(oid)'];
$oid = $maxid   1; -- this gives me a new OID for the next entry since i can not auto increment this column
 

Комментарии:

1. Во-первых, вы могли бы упростить этот SQL до SELECT MAX(oid) 1 AS next_oid FROM ordr . Во-вторых, генерация нового OID является рискованной, если вы не заблокируете или иным образом не защитите транзакционно его генерацию и последующее использование. В-третьих, вообще не делайте этого таким образом — вместо этого смотрите Ответ Брендана.

2. Спасибо за это… Вы правы, ответ Брендана — это то, что мне было нужно.

3. я проголосовал, потому что это был глупый вопрос?

4. @DanielHunter — Я предполагаю, что люди проголосовали за вопрос, потому что он «очевиден», но, конечно, это очевидно, только если вы уже знаете ответ: p Я бы не стал принимать это на свой счет и имейте в виду, что для противодействия 5 голосам против требуется всего один голос.

5. 😉 После просмотра это очевидно. Я продолжаю пытаться минимизировать количество таблиц, и это действительно только усложняет задачу. еще раз спасибо.

Ответ №1:

Вероятно, вы захотите использовать столбцы с автоматическим увеличением. Это позволит вам вставить данные, а MySQL выберет для вас индекс. Однако для этого вам потребуется денормализовать ваши данные.

Вам понадобятся две таблицы: orders и order_items , где:

 orders
------
order_id
[any other columns]


order_items
-----------
item_id
order_id
[any other columns]
 

Вставьте заказ в orders таблицу с помощью a NULL order_id и запишите order_id , что устанавливает MySQL. Теперь вставьте order_item , используя order_id то, что у вас есть, и позвольте ему автоматически сгенерировать item_id .

Таким образом, MySQL будет генерировать числа, поэтому вам не нужно беспокоиться о двух заказах, пытающихся использовать один и тот же идентификатор заказа. Кроме того, любая информация о заказе не будет дублироваться для каждого элемента в заказе.

Комментарии:

1. Я знал, что мне не хватает чего-то очень простого. Это имеет смысл. Думаю, мне просто нужна была еще одна голова, чтобы подтолкнуть меня в правильном направлении. Спасибо!!