Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
Есть две таблицы. В каждой по полю, которое заполняю автоинкрементом. Надо реализовать тестовые данные для связи один к одному.
Я предполагаю сделать так: взять таблицу, в которой меньше записей и случайным образом соединить их с записями из второй таблицы. Но как это сделать средствами MySQL не знаю.
22 май 20, 20:43    [22137931]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20407
Связь 1:1 - это теоретический измышлизм, который невозможно реализовать на практике. Реально это всегда 1:(0 или 1).

AnnitaBells
как это сделать средствами MySQL не знаю.
А версия-то у MySQL есть? и какая именно...
22 май 20, 21:20    [22137939]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3221
AnnitaBells,

в одной таблице добавим поле, делаем уникальный форейжн на автоинкремент другой таблицы.
22 май 20, 21:40    [22137947]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
miksoft
Member

Откуда:
Сообщений: 38319
AnnitaBells
в которой меньше записей
Если записей не одинаковое количество, то какой же "один к одному" ?
22 май 20, 21:54    [22137951]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
miksoft
Member

Откуда:
Сообщений: 38319
Akina
Связь 1:1 - это теоретический измышлизм, который невозможно реализовать на практике.
А два встречных внешних ключа разве не делают это?
22 май 20, 21:56    [22137953]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
Akina
А версия-то у MySQL есть? и какая именно...

5.1

Alex_Ustinov
AnnitaBells,
в одной таблице добавим поле, делаем уникальный форейжн на автоинкремент другой таблицы.

Там три таблицы. Хочу третью заполнить данными из первых двух.

table1 (t1ID number AI, ...)
table2 (t2ID number AI, ...)
table3 (t1ID, t2ID)

t1ID и t2ID заполняю автоматом, иногда удаляю записи, поэтому могут быть пробелы в данных. Как заполнить table3?
22 май 20, 21:59    [22137957]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
miksoft
Member

Откуда:
Сообщений: 38319
AnnitaBells,

по какой логике t1ID должен соответствовать t2ID ?
22 май 20, 22:47    [22137986]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
miksoft,

Записи связываются случайным образом, главное, чтобы t1ID сотоветствовал одному и только одному t2ID (а t2ID соответствовал одному и только одному t1ID).
22 май 20, 23:00    [22137989]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20407
miksoft
А два встречных внешних ключа разве не делают это?
Делают... только без права вставки, ибо любой INSERT упрётся в отсутствие связанной записи. А нахрена нужна связь при Read-only?
23 май 20, 00:18    [22138020]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3567
Akina
только без права вставки

Не обязательно.
Может быть сервисная запись с id=0, на которую будет ссылаться создаваемая запись и в которой затем fk будет обновляться.
23 май 20, 10:46    [22138077]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3221
AnnitaBells

Там три таблицы. Хочу третью заполнить данными из первых двух.

table1 (t1ID number AI, ...)
table2 (t2ID number AI, ...)
table3 (t1ID, t2ID)

t1ID и t2ID заполняю автоматом, иногда удаляю записи, поэтому могут быть пробелы в данных. Как заполнить table3?
так в чем проблема, так и не понял. Уникальный ключ на (t1ID, t2ID) триггера на удаление из таб1 и таб2
23 май 20, 11:06    [22138079]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
Alex_Ustinov,

нужен insert into table3 select ... from ... (хитрый запрос из первой и второй, смысл я писала в первом сообщении "взять таблицу, в которой меньше записей, и случайным образом соединить эти записи с записями из второй таблицы")
Данные уже есть в таблицах. Зачем триггер?
23 май 20, 12:06    [22138092]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
miksoft
Member

Откуда:
Сообщений: 38319
Akina
miksoft
А два встречных внешних ключа разве не делают это?
Делают... только без права вставки, ибо любой INSERT упрётся в отсутствие связанной записи. А нахрена нужна связь при Read-only?
В Оракле, например, существуют deferred constraints, которые проверяются в момент коммита, а не инесерта.

В MySQL можно попробовать, если внешние ключи делать на разных парах полей.
23 май 20, 12:06    [22138093]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
miksoft
Member

Откуда:
Сообщений: 38319
AnnitaBells
нужен insert into table3 select ... from ... (хитрый запрос из первой и второй, смысл я писала в первом сообщении "взять таблицу, в которой меньше записей, и случайным образом соединить эти записи с записями из второй таблицы")
INSERT INTO table3 (t1ID, t2ID)
SELECT 
(SELECT @i1 := @i1 + 1 AS row_number1, your_table.t1ID 
FROM table1 , (select @i1:=0) AS z1) t1
JOIN
(SELECT @i2 := @i2 + 1 AS row_number2, your_table.t2ID
FROM table2 , (select @i2:=0) AS z2) t2
ON t1.row_number1=t2.row_number2

Но записей получится столько, сколько в меньшей таблице.

Сообщение было отредактировано: 23 май 20, 13:11
23 май 20, 12:17    [22138096]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20407
Alibek B.
Может быть сервисная запись с id=0, на которую будет ссылаться создаваемая запись
Сервисная запись - это тем не менее запись. И она либо будет 1:0 до вставки, либо 1:2 посередине процесса.
miksoft
В Оракле, например, существуют deferred constraints, которые проверяются в момент коммита, а не инесерта.

В MySQL можно попробовать, если внешние ключи делать на разных парах полей.
Связь 1:1 - это не когда МОЖНО создать записи, связанные 1:1, а когда НЕЛЬЗЯ создать записи, НЕ соответствующие этому соотношению.
23 май 20, 13:04    [22138114]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
miksoft
Но записей получится столько, сколько в меньшей таблице.

Подправила и получила именно то, что хотела. Спасибо! Ещё добавила rand().
23 май 20, 13:18    [22138119]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
miksoft,

а не могли бы Вы мне подсказать, что делать со связью один ко многим? 22138133 Спасибо!
23 май 20, 14:00    [22138137]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Нестандартное мышление
Member

Откуда:
Сообщений: 55
AnnitaBells
miksoft,

а не могли бы Вы мне подсказать, что делать со связью один ко многим? 22138133 Спасибо!


В смысле? Что делать надо? Цель какая?

Один ко многим это PK и FK
23 май 20, 15:59    [22138172]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
Нестандартное мышление
AnnitaBells
miksoft,

а не могли бы Вы мне подсказать, что делать со связью один ко многим? 22138133 Спасибо!


В смысле? Что делать надо? Цель какая?

Один ко многим это PK и FK


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

Сообщение было отредактировано: 23 май 20, 16:21
23 май 20, 16:22    [22138183]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Нестандартное мышление
Member

Откуда:
Сообщений: 55
AnnitaBells
Нестандартное мышление
пропущено...


В смысле? Что делать надо? Цель какая?

Один ко многим это PK и FK


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


В связи один ко многим не надо 3 таблицы
Там используются 2. В одной - где одни, вторая - где многие

Вообще Вам зря посоветовали связь 1-1 делать через 3 таблицы

Черерез 3ю таблицу делается связь многие ко многим
23 май 20, 17:09    [22138211]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Нестандартное мышление
Member

Откуда:
Сообщений: 55
Нестандартное мышление,

И вообще. Если связи 1-1, то почему в одной таблице не хранить?
23 май 20, 17:14    [22138215]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
AnnitaBells
Member

Откуда:
Сообщений: 104
Нестандартное мышление
Нестандартное мышление,

И вообще. Если связи 1-1, то почему в одной таблице не хранить?

Разные сущности.
23 май 20, 17:44    [22138234]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Нестандартное мышление
Member

Откуда:
Сообщений: 55
AnnitaBells
Нестандартное мышление
Нестандартное мышление,

И вообще. Если связи 1-1, то почему в одной таблице не хранить?

Разные сущности.


Сущности чего? Если связь 1 в 1?
Поясните тогда, что Вы в разных таблицах храните?
23 май 20, 17:46    [22138236]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3221
AnnitaBells
Alex_Ustinov,

нужен insert into table3 select ... from ... (хитрый запрос из первой и второй, смысл я писала в первом сообщении "взять таблицу, в которой меньше записей, и случайным образом соединить эти записи с записями из второй таблицы")
Данные уже есть в таблицах. Зачем триггер?
см выше
автор
t1ID и t2ID заполняю автоматом, иногда удаляю записи, поэтому могут быть пробелы в данных.
23 май 20, 18:11    [22138247]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать связь один к одному?  [new]
Нестандартное мышление
Member

Откуда:
Сообщений: 55
Alex_Ustinov
AnnitaBells
Alex_Ustinov,

нужен insert into table3 select ... from ... (хитрый запрос из первой и второй, смысл я писала в первом сообщении "взять таблицу, в которой меньше записей, и случайным образом соединить эти записи с записями из второй таблицы")
Данные уже есть в таблицах. Зачем триггер?
см выше
автор
t1ID и t2ID заполняю автоматом, иногда удаляю записи, поэтому могут быть пробелы в данных.


Это ад какой то
Значит удаление неправильное. Мертвых записей море будет

А один ко многим - это вообще цирк с таким подходом будет

Можно без триггера, но тогда очень аккуратно логику UpdInsDel делать

Коточе - какое то безобразие
23 май 20, 18:19    [22138249]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / MySQL Ответить