#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. Я знал, что мне не хватает чего-то очень простого. Это имеет смысл. Думаю, мне просто нужна была еще одна голова, чтобы подтолкнуть меня в правильном направлении. Спасибо!!