Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> таблица с уникальной комбинацией значений, как создать 
:(
    Опции темы
slang
Дата 15.8.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Есть таблица: TB с тремя полями tb_1, tb_2, tb_3. Необходимо сделать такой запрос создания этой таблицы, при котором будет не возможно добавлять новые записи, в которых комбинация tb_2 и tb_3 уже встречались. Например, строка
NULL, 1,1 - добавлена
NULL, 1,2 - добавлена
NULL, 1,1 - отказ (см. первую строку)



--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Bikutoru
Дата 15.8.2005, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Код

CREATE TABLE tbl (
  field_1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  field_2 INT,
  field_3 INT,
  UNIQUE (field_2, field_3)
);

или
Код

CREATE TABLE tbl (
  field_1 INT NOT NULL,
  field_2 INT NOT NULL,
  PRIMARY KEY(field_1, field_2)
);

Во втором варианте поле обязано быть NOT NULL


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 15.8.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Делаешь SELECT перед вставкой, с GROUP BY tb2 , tb3
PM ICQ   Вверх
Bikutoru
Дата 15.8.2005, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата
Делаешь SELECT перед вставкой, с GROUP BY tb2 , tb3

Mal Hack, и это я слышу от тебя??? Никогда бы не поверил...

GROUP BY - "тормозная" операция гораздо проще (и быстрее) поставить уникальный индекс / первичный ключ, который и будет обеспечивать требуемую уникальность без всяких дополнительных запросов. При попытке добавления неуникальной по данным полям записей произойдет ошибка, которую можно легко отловить через mysql_error() / mysql_errno()

Это сообщение отредактировал(а) Bikutoru - 15.8.2005, 13:07


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 15.8.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Bikutoru @ 15.8.2005, 14:06)
Mal Hack, и это я слышу от тебя??? Никогда бы не поверил...

В данном случае я руководствуюсь тем, что ошибка она и есть ошибка, а следовательно, субъективно это нехорошо и фиг знает как она повлиять могла.
И еще я привык на ошибки откладывать только то, что говорит о том, что запрос не был выполнен.

PM ICQ   Вверх
slang
Дата 15.8.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Bikutoru
Код

CREATE TABLE tbl (    
  field_1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY    
  field_2 INT,    
  field_3 INT,    
  UNIQUE (field_2, field_3)    
);

Ведь в этом случае не возможно будет сделать следующие запросы:
Код

INSERT INTO tbl VALUE (NULL, 1,1) - пройдет
INSERT INTO tbl VALUE (NULL, 1,2) - не пройдет, так как field_2, тоже должно быть уникальным

, а должно быть
Код

INSERT INTO tbl VALUE (NULL, 1,1) - пройдет
INSERT INTO tbl VALUE (NULL, 1,2) - пройдет
INSERT INTO tbl VALUE (NULL, 2,1) - пройдет
INSERT INTO tbl VALUE (NULL, 1,2) - не пройдет, так как см. 2 строка

Суть: в данном контексте
field_1 - id строки
field_2 - id user
field_3 - id группы

Пользователь может принадлежать нескольким группам, но не может принадлежать одной группе дважды (в целях экономии места БД, да и просто чистоты). Реализовать это на PHP - можно и не сложно, однако, если операции с базой будет контролировать SQL - это гораздо удобнее, безопаснее и т.д. При относительно "большом" проекте, можно вполне где-то напутать с запросами, как мне кажется.



--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Bikutoru
Дата 15.8.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата(slang @ 15.8.2005, 14:30)
Bikutoru

CREATE TABLE tbl (
field_1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
field_2 INT,
field_3 INT,
UNIQUE (field_2, field_3)
);

Ведь в этом случае не возможно будет сделать следующие запросы:

INSERT INTO tbl VALUE (NULL, 1,1) - пройдет
INSERT INTO tbl VALUE (NULL, 1,2) - не пройдет, так как field_2, тоже должно быть уника


slang, задам вопрос: "А ты проверял?" И сразу отвечу: "Нет". Ибо они нормально работают. А уникальность проверяется не по отдельным столбцам, а по их совокупности. Не веришь - проверь.


Mal Hack, по-моему, если есть возможность обеспечить целостность данных средствами СУБД, то лучше сделать это, а не прибегать к собственным ухищрениям, на которые другой программист, который будет работать с тем же проектом, может и наплевать...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
slang
Дата 15.8.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Bikutoru
Извини, ты прав!!!
Сделал вывод используя не практическую проверку, а информацию из литературы и был НЕ прав.
Спасибо.


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Bikutoru
Дата 15.8.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



slang, пожалуйста, но в следующий раз проверяй прежде чем возражать, если не уверен smile


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 15.8.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Bikutoru @ 15.8.2005, 14:40)
если есть возможность обеспечить целостность данных средствами СУБД, то лучше сделать это,

Ошибка не есть целостность данных.
PM ICQ   Вверх
Bikutoru
Дата 15.8.2005, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата(Mal @ 15.8.2005, 15:07)
Ошибка не есть целостность данных.

А когда человек несумевший или незахотевший достаточно разобраться в твоем скрипте "забудет" об ограничении науникальность?.. Что тогда?

К тому же ошибка, возникающая при попытке добавления неуникального значения в поле unique, вполне узнаваема ("Duplicate entry '...' for key ...", код 1062).
К тому же, основываясь на одной логике, можно прийти к выводу, что попытка добавить неуникальное значение в уникальное поле - это ошибка в работе приложения и она тоже должна быть как-то обработана. Так что этот аргумент
Цитата(Mal @ 15.8.2005, 14:21)
ошибка она и есть ошибка, а следовательно, субъективно это нехорошо

отпадает. Дальше

Цитата(Mal @ 15.8.2005, 14:21)
я привык на ошибки откладывать только то, что говорит о том, что запрос не был выполнен

Это тоже не аргумент, т.к. запрос и не выполняется smile

P.S. Не хотел спорить, а заставляют... smile
Добавлено @ 14:50
К тому же контроль целостности на уровне сервера БД упрощает скрипт и разгружает сервер приложений. (Правда они могут быть и одним сервером, но это же частный случай smile)


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 15.8.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Bikutoru тебе что выгоднее... Если упадет Апач или сервер БД?
PM ICQ   Вверх
Bikutoru
Дата 15.8.2005, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Мне выгоднее, когда ничего не будет падать.
Но если нужно выбирать, то скорее сервер БД, ибо страницы я могу и закешировать ибрать из кеша, когда база лежит. А вот закешировать скрипты и брать их из базы... как-то слабо в это верится... А как это относится в теме дискуссии?

P.S. В "Религиозные войнЫ" тему!..
Добавлено @ 15:06
или в "Общие вопросы по БД"


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 15.8.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Bikutoru @ 15.8.2005, 16:04)
А как это относится в теме дискуссии?

Вообще на проектах всегда самое страшное когда БД упадет, т.к. в таком случае могут потеряться данные.
А если упадет сервер приложений, то данные не потеряются. исключительные ситуация конечно могут быть, но это уже маловероятно.

PM ICQ   Вверх
Bikutoru
Дата 15.8.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата(Mal @ 15.8.2005, 16:09)
Вообще на проектах всегда самое страшное когда БД упадет, т.к. в таком случае могут потеряться данные

Я думал, "упадет" в данном случае означает "временно откажется работать".
Можно же хранить информацию сразу на нескольких жестких (вроде бы, RAID-массив называется) тогда вероятность отказа из за неисправности HDD невелика, UPS и т.п. сводят такую вероятность к достаточно небольшому значению. Плюс регулярное копирование информации...
К тому же, при перегрузке СУБД (тот же MySQL) просто перестает обрабатывать вновь поступающие запросы...

Все-таки, по-моему, обеспечивать целостность скриптом, если можно базой не нужно...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1200 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.