SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.10.2014 15:23:09

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Внешний ключ на представление. Возможно?

Есть таблица `sections`


select * from sections;
+---------+------+
| section | cell |
+---------+------+
|       1 | 001  |
|       1 | 002  |
|       2 | 001  |
|       2 | 002  |
|       3 | 001  |
|       3 | 002  |
+---------+------+
 

причем эти 2 поля объявлены как PRIMARY KEY (`section`,`cell`)

и другая

select * from list;
+------------+---------+
| n_tran    | section |
+------------+-------+
| 185        |       1 |  
| 234        |       1 |  
| 185        |       2 |  
| 234        |       2 |  
| 185        |       3 |  
| 234        |       3 |  
+------------+-------+
 

у неё  PRIMARY KEY (`section`,`n_tran`)

Нужно чтобы при вставке в таблицу LIST в поле section разрешалось добавлять только те значения, которые уже содержаться в таблице sections, в его поле sections.
Создание простого Внешнего ключа, мне кажется не имеет смысла и не правильно, так как в первой таблице оба поля PK и может содержать несколько секций с нужным номером, например 1. (Это 1 и 2-я строка )
|       1 | 001  |
|       1 | 002  |

Встал вопрос как же добиться ограничения?
Создать представление с запросом
select DISTINCT `section` from sections;

помогло бы, но как на него повесить внешний ключ для второй таблицы? Если нельзя создавать внешний ключ на представление, то как выйти из ситуации?

Еще важное замечание. Все таблицы заполняются с помощью LOAD DATA INFILE (или как его там), это значит, подготавливая данные для второй таблицы, ПО не будет иметь возможности обращаться к первой и проверять отдельным запросом: "А есть ли у тебя там в поле section такие-то значения??"
Нужно спроектировать БД так, чтобы движок сам отсеивал такие строки (для второй таблицы), у которых в поле section НЕТ соответствующих им полей из первой таблицы, как это делал бы внешний ключ. Он бы просто не разрешил вставку такого поля.

Еше раз подчеркну - такой метод вставки данных подразумевает, что у меня не будет операторов INSERT со всякими проверками. Я вставляю в таблицу все подготовленные в файле данные одним махом (командой LOAD DATA INFILE  <файл> )!

Отредактированно Cheb (16.10.2014 15:33:08)

Неактивен

 

#2 16.10.2014 19:38:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Внешний ключ на представление. Возможно?

FOREIGN KEY не поможет, так как если будет ошибка, остаток файла не вставится. Делайте LOAD DATA INFILE в другую таблицу, а потом из нее вставляйте в основную, наложив условие.

Неактивен

 

#3 17.10.2014 12:06:54

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: Внешний ключ на представление. Возможно?

Да. А скорость такого действия я надеюсь будет приемлемая.
В таблице допустим 2 тысячи записей. Да и ещё , ПО многопоточное, каждый поток будет работать с одними и теми же таблицами, но исходные данные у каждого свои. Что тогда каждому потоку создавать свои буферные таблицы? Число потоков заранее неизвестно, зависит от железа и левой пятки админа.
Не слишком ли сложно тогда получается?

Ну вообще это идея. спасибо!

Отредактированно Cheb (17.10.2014 12:10:52)

Неактивен

 

#4 17.10.2014 12:50:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Внешний ключ на представление. Возможно?

Да, буферную таблицу создавать с уникальным именем, а потом удалять. Лучше не TEMPORARY, чтобы не было трудностей с репликацией. Задача изначально поставлена такая, что проще всего ее решать на уровне таблиц.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson