MySQL / PHP для обновления, если строка существует, или вставка, когда проверяемый столбец не является уникальным - PullRequest
0 голосов
/ 10 октября 2009

Я читал о ключевых запросах REPLACE и INSERT ON DUPLICATE, и хотя я вижу, насколько они полезны, они, похоже, не работают для моих целей. Возможно, мой дизайн базы данных отличается от того, каким он должен быть, но в любом случае я надеюсь, что смогу заставить это работать.

Я пытаюсь создать макет интернет-магазина, чтобы научить себя mysql и php, и записываю идентификатор сеанса, чтобы использовать его при извлечении корзины человека для отдельного посещения и попытке записать инвентарь в корзину, где я проблема заключается в попытке проверить, есть ли товар в корзине или нет. Я хочу, чтобы каждый элемент был уникальным для каждого пользователя, однако он не должен быть уникальным для всей таблицы, иначе это не позволит нескольким пользователям покупать один и тот же элемент, не так ли?

Мой стол пока выглядит так:

 | Cart ID(key) | USER_ID(fk) | ItemNum | ItemQTY |

и я по сути хочу посмотреть, есть ли в USER_ID> 0 ItemQTY ItemNum в их корзине. Если они это сделают, я бы хотел, чтобы itemQTY обновил до itemQTY +, сколько бы они ни добавили, а если нет, то вставьте новую строку.

Должен ли я сделать запрос, прежде чем писать, чтобы сделать это?

Ответы [ 4 ]

2 голосов
/ 10 октября 2009

Для новичка ... Я думаю, что это нормально, просто запустить запрос, чтобы проверить, есть ли он. Затем, когда вы, как правило, будете лучше знакомы с php и mysql, начните строить свои знания.

Другие могут не соглашаться, но при изучении новых языков мне нравится заставлять вещи работать до того, как я сделаю их «совершенными».

1 голос
/ 10 октября 2009

Традиционное программное обеспечение корзины покупок имеет одну корзину на пользователя, и эта корзина восстанавливается каждый раз, когда пользователь возвращается. Поскольку у вас есть и CartID, и UserID, создается впечатление, что пользователь может иметь несколько тележек.

Принимая во внимание, что может быть лучше иметь три стола; Users, Carts & CartItems

Users потребуется UserID, Carts потребуется CartID и что-то вроде OwnerID (ссылка Users.UserID), а CartItems будет иметь CartID (ссылка Carts.CartID), ItemID и Quantity.

Вы можете даже стать проще, поскольку у Пользователя будет только одна Корзина, вы можете полностью игнорировать таблицу Корзин и заменить CartItems.CartID на CartItems.OwnerID (ссылаясь на Users.UserID.

Надеюсь, это полезно.

1 голос
/ 10 октября 2009

Я думаю, вам нужен уникальный ключ для нескольких столбцов в CartID и ItemNum:

alter table my_table add unique( CartID, ItemNumber );

Тогда вы можете сделать:

insert into my_table values( 1, 'joe', 12345, 1 ) on duplicate key update ItemQTY = ItemQTY + 1;
1 голос
/ 10 октября 2009

Вы можете написать хранимую процедуру и использовать хранимую процедуру для обработки вставок.

Вам нужно будет научиться писать хранимые процедуры и выполнять их из PHP.

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

НТН.

...