Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > использование UNIQUE


Автор: GrafF812 24.3.2010, 15:21
Здравствуйте, в моей таблицы для одного из полей используется параметр Unique,  скажите пожалуйста можно ли после запроса INSERT узнать id той строки, в которой уже имеются уникальные для нее данные ? 

Автор: bars80080 24.3.2010, 15:22
можно 
Код

SELECT last_insert_id()

Автор: azesmcar 24.3.2010, 15:29
bars80080

По моему ты не так понял вопрос, если я правильно понял, он хочет после exception-а узнать id строки.

GrafF812
Если это для UPDATE-а то в mysql есть такая штука
Код

INSERT INTO table (...) VALUES (...)
ON DUPLICATE KEY
UPDATE ...

WHERE для UPDATE-а не нужен, он автоматически будет использовать уникальный ключ и повторившееся значение.

Автор: bars80080 24.3.2010, 15:34
да, не втыкнул сразу

Автор: GrafF812 24.3.2010, 15:49
azesmcar, Вот смотрите что мне нужно, допустим есть таблица Fruits:
Код

id         name          price
1         Яблоко        50
2         Груша          70
3         Банан          85

Все поля таблицы объявлены unique. Допустим я хочу довать в таблицу следующий фрукт:
Код

INSERT INTO Fruits VALUES('0','Груша','100');

этот запрос не вставит его в таблицу, т.к "Груша" уже есть в строке с id=2, вот мне как раз и нужно узнаь этот id той строки.  

Автор: Fortop 24.3.2010, 16:03
перед вставкой сделать
Код

SELECT * FROM `table` WHERE `name`='Груша'

Автор: azesmcar 24.3.2010, 16:04
Цитата(GrafF812 @  24.3.2010,  15:49 Найти цитируемый пост)
Вот смотрите что мне нужно

Я понял что вам нужно, я лишь не понял для чего. Если это нужно для обновления (т.е. не сумел добавить запись, обнови существующую) тогда так, как я написал, если для чего-то другого - можно подумать, именно способа для получения ID насколько мне известно нет, разве что сделать parse строки ошибки.

Автор: GrafF812 24.3.2010, 16:09
azesmcar, мне это нужно не для UPDATE, мне нужно просто запомнить этот id, чтобы потом использовать, 
Fortop, спасибо за пример, не хотелось бы вводить еще один запрос, можно ли как-нибуть по другому? 
p.s вариант с парсом ошибки мне не подойдет.

Автор: azesmcar 24.3.2010, 16:11
GrafF812

нет, по другому никак, запускайте запрос select как показал Fortop.

Автор: GrafF812 24.3.2010, 16:31
azesmcar, ясно спасибо, подскажите пожалуйста, по поводу парсинга ошибки. Какие данные есть в ошибке которые помогут решит мою проблему? 

Автор: azesmcar 24.3.2010, 16:38
Цитата(GrafF812 @  24.3.2010,  16:31 Найти цитируемый пост)
azesmcar, ясно спасибо, подскажите пожалуйста, по поводу парсинга ошибки. Какие данные есть в ошибке которые помогут решит мою проблему?  

я бы написал select, parsing ошибки дело неблагородное. А ошибка имеет такой вид
Цитата

Duplicate entry 'Груша' for key 1

хотя если тебе не значение уникального поля нужно а именно ID - тогда и это не подходит.

Автор: Fortop 24.3.2010, 16:43
Цитата(GrafF812 @  24.3.2010,  15:09 Найти цитируемый пост)
 не хотелось бы вводить еще один запрос, можно ли как-нибуть по другому? 

Это нормальная практика.
Если нужен ID то делается SELECT. 
Если нужна вставка, то делается INSERT
Если нужен апдейт, то делается именно UPDATE

INSERT'ами же узнавать ID  - это и нелогично и неправильно.

Автор: GrafF812 24.3.2010, 17:36
Fortop, понял всем спасибо. Буду делать SELECT

Автор: GrafF812 24.3.2010, 21:58
Прошу прощения, подскажите как настроить поля (UNIQUE) и сделать запрос на вставку в таблицу если только не совпадают два поля name и price:
Код

id         name          price
1         Яблоко        50
2         Груша          70
3         Банан          85

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

INSERT INTO Fruits VALUES('0','Груша','100');

а этот не должен вставиться поскольку такое name и price уже есть в таблице
Код

INSERT INTO Fruits VALUES('0','Груша','70');

Автор: azesmcar 24.3.2010, 22:03
надо сделать уникальными сочетание этих двух полей
Код

UNIQUE KEY(name, price)


но в таком случае я бы посоветовал вынести определение фруктов в отдельную таблицу. т.е. так
Цитата

id      name
1       Груша
2       Яблоко


Цитата

id      name_id    price
1       1             70
2       1             100


Автор: GrafF812 24.3.2010, 23:12
azesmcar, а в пределах одной таблицы можно так сделать?

Автор: Fortop 24.3.2010, 23:49
Один уникальный составной индекс по 2м полям поставить

Автор: azesmcar 25.3.2010, 06:39
я же написал
Цитата(azesmcar @  24.3.2010,  22:03 Найти цитируемый пост)
UNIQUE KEY(name, price)

Код

CREATE TABLE fruits
(
    id INT UNSIGNED NOT NULL auto_increment,
    name VARCHAR(20),
    price INT,
    PRIMARY KEY(id),
    UNIQUE KEY(name, price)
);

Автор: GrafF812 25.3.2010, 08:21
azesmcar, спасибо, а можете написать как тогда правильно запрос составить?

Автор: azesmcar 25.3.2010, 08:27
Цитата(GrafF812 @  25.3.2010,  08:21 Найти цитируемый пост)
azesmcar, спасибо, а можете написать как тогда правильно запрос составить? 

какой запрос?

Автор: GrafF812 25.3.2010, 17:39
Цитата(azesmcar @  25.3.2010,  08:27 Найти цитируемый пост)
какой запрос?

на вставку значений, просто если мы объявляем два поля как UNIQUE то при вставле отсеиваются все запросы в которых есть хотябы есть одно повторение ключа, а мне нужно чтобы отсеивались когда совпадает name+price. 

Автор: azesmcar 25.3.2010, 18:52
Цитата(GrafF812 @  25.3.2010,  17:39 Найти цитируемый пост)
на вставку значений, просто если мы объявляем два поля как UNIQUE то при вставле отсеиваются все запросы в которых есть хотябы есть одно повторение ключа, а мне нужно чтобы отсеивались когда совпадает name+price.  

не совсем понимаю проблему
Код

CREATE TABLE fruits
(
    id INT UNSIGNED NOT NULL auto_increment,
    name VARCHAR(20),
    price INT,
    PRIMARY KEY(id),
    UNIQUE KEY(name, price)
);

INSERT INTO fruits(name, price) VALUES('apple', 10);
INSERT INTO fruits(name, price) VALUES('apple', 20);
INSERT INTO fruits(name, price) VALUES('peach', 10);
INSERT INTO fruits(name, price) VALUES('peach', 30);
INSERT INTO fruits(name, price) VALUES('apple', 10); // Duplicate entry 'apple-10' for key 2


Автор: GrafF812 25.3.2010, 21:27
azesmcar, спасибо Вам большое за помощь, скажите а в чем разница:
Код

UNIQUE KEY(name, price)

и
Код

UNIQUE (name, price)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)