Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Повторные записи в таблице

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ant
Отправлено: 30 Июня, 2012 - 15:52:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


Помог: 0 раз(а)




Здравствуйте.

Допустим есть простая таблица, в ней 3 поля:
1. id INT (автоинкремент)
2. idUser1 INT
3. idUser2 INT

Есть 2 комбинации, которые не должны повторяться в таблице.
1. Если в таблице есть запись idUser1=3 idUser2=15, то записей с idUser1=3 idUser2=15 больше быть НЕ должно.
2. Если в таблице есть запись idUser1=3 idUser2=15, то записей idUser1=15 idUser2=3 (то есть наоборот) быть также НЕ должно.

Какие есть оптимальные варианты гарантировать, что подобных записей в такой таблице MySQL не возникнет?
 
 Top
Мелкий Супермодератор
Отправлено: 30 Июня, 2012 - 16:02:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Первое - уникальный ключ на оба поля.
Второе - сходу ничего не приходит в голову.

И зачем в этой таблице первое поле?


-----
PostgreSQL DBA
 
 Top
ant
Отправлено: 30 Июня, 2012 - 16:25:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


Помог: 0 раз(а)




Первое поле - автоинкремент? Я привел только часть таблицы, в этой таблице еще есть поля. Зря я о нем в вопросе упомянул... оно не имеет к задаче никакого отношения.

Получается на уровне самой субд нельзя это сделать... только средствами php перед отправкой запроса на добавление новой записи проверять?..
 
 Top
EuGen Администратор
Отправлено: 30 Июня, 2012 - 18:28:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Создайте 2 уникальных ключа: первый по полям (iduser1,iduser2), второй по полям (iduser2,iduser1)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 30 Июня, 2012 - 18:55:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




EuGen, уникальности-то от этого не прибавится. Другой порядок полей уникального индекса только для других запросов полезен.

По теме полезный идей нету.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 30 Июня, 2012 - 19:18:29
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Да, Вы правы, не тот контекст. Я почему-то не подумал, что он 1 раз все же позволит вставить данные, чего нельзя по условию.
Для mysql >=5.5 можно сделать примерно так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. DELIMITER |
  3. |
  4. CREATE TRIGGER uqdouble BEFORE INSERT ON temp
  5. FOR EACH ROW BEGIN
  6.   DECLARE num_rows INTEGER;
  7.   DECLARE msg VARCHAR(255);
  8.   SELECT COUNT(*)
  9.   INTO num_rows
  10.   FROM temp
  11.   WHERE (iduser1 = NEW.iduser2 AND iduser2 = NEW.iduser1) OR (iduser1 = NEW.iduser1 AND iduser2 = NEW.iduser2);
  12.   IF (num_rows>0) THEN
  13.     SET msg = "INTERRUPT: integrity check fails for unsorted key (iduser1,iduser2)";
  14.     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
  15.   END IF;
  16. END
  17. |
  18. DELIMITER ;


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB