Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
Столкнулся с проблемой, что связующая таблица в отношении many-to-many не редактируется (UPDATE). Короткое гугление привело к открытию, что это исключительно из-за того, что у этой таблицы не было primary key поля.
По идее pk в такой таблице не нужен.. Но пришлось сделать (при этом не использовать). Раньше я работал в основном с Oracle, там такой проблемы не было, там других граблей хватало (чего только работа с датами и таймстампами стоит!)

Причем наткнулся-то случайно! В TOAD-е попробовал смотреть и редактировать, выдает ошибку "Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей". До этого Spring JDBC молчком отвергал попытки редактирования записей. У него это в порядке вещей - половину ошибок не обрабатывает, гад!. Довольно долго я тупил, дескать на глаззах происходит невероятное!.. )))

А как вы реализуете отношение many-to-many в MySQL ?
13 окт 11, 08:48    [11431231]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
я с MySQL не знаком, но по-моему это ошибки не сервера, а клиента
13 окт 11, 10:37    [11431718]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Не редактируется клиентом (читай автогенерилкой инструкций механизмом доступа к данным) и не выполнятеся UPDATE - суть две большие разницы. У Вас первый случай.
13 окт 11, 10:38    [11431730]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
Так от этого же не легче!
13 окт 11, 10:49    [11431827]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
adv
Member

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

вкраце:
mysql> create table n (
    -> i int not null primary key
    -> );
Query OK, 0 rows affected (0.13 sec)

mysql> create table m (
    -> j int not null primary key
    -> );
Query OK, 0 rows affected (0.11 sec)

mysql> insert into n values (1);
Query OK, 1 row affected (0.03 sec)

mysql> insert into n values (2);
Query OK, 1 row affected (0.02 sec)

mysql> insert into n values (3);
Query OK, 1 row affected (0.02 sec)

mysql> insert into m values (1);
Query OK, 1 row affected (0.02 sec)

mysql> insert into m values (2);
Query OK, 1 row affected (0.02 sec)

mysql> insert into m values (3);
Query OK, 1 row affected (0.02 sec)

mysql> create table mn (
    -> i int not null,
    -> j int not null,
    -> foreign key (i) references n (i),
    -> foreign key (j) references m (j)
    -> );
Query OK, 0 rows affected (0.30 sec)

mysql> insert into mn (i, j) values (1, 1);
Query OK, 1 row affected (0.03 sec)

mysql> insert into mn (i, j) values (1, 2);
Query OK, 1 row affected (0.03 sec)

mysql> update mn set j=3 where i=1 and j=2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Но это не значит, что ПК не нужен.
Очень даже нужен.
13 окт 11, 10:52    [11431859]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
qwerty112
Guest
mesier
По идее pk в такой таблице не нужен..

1
pk нужен всегда
2
pk - это не обязательно автоинкриментное поле
13 окт 11, 11:00    [11431942]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
adv
mesier,
mysql> create table mn (
    -> i int not null,
    -> j int not null,
    -> foreign key (i) references n (i),
    -> foreign key (j) references m (j)
    -> );

Ненене! Вообще не то! Во-1, вы зря думаете, что я это не пробовал.. Во-2, вторичные ключи прежде всего служат как ограничение целостности - гарантия того, что в поле с foreign key не появится "левых" ИДшников, отсутствующих в первичном ключе.. На разрешение редактирование это не влияет. Рекомендую попробовать одновременно залогиниться с 2-3 мест и что-нибудь проапдейтить в этой таблице. Думаю, ждет разочарование..

adv
Но это не значит, что ПК не нужен. Очень даже нужен.

Зачем он в связующей таблице?
13 окт 11, 11:19    [11432147]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
qwerty112
mesier
По идее pk в такой таблице не нужен..

1
pk нужен всегда

Вопрос тот же - зачем он в связующей таблице отношения many-to-many?
qwerty112
2
pk - это не обязательно автоинкриментное поле

Но всегда уникальное. Что сводит на нет использование его в данном случае..

Впрочем, вопрос остается открытым: если знаете как реализовать много-ко-многим по другому, более рационально - с удовольствием выслушаю!
13 окт 11, 11:21    [11432176]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
mesier
qwerty112
пропущено...

1
pk нужен всегда

Вопрос тот же - зачем он в связующей таблице отношения many-to-many?
что бы Вам было легче и Вы могли редактировать на клиенте
а так, если таблица не предполагает редактирования - не нужен
13 окт 11, 11:26    [11432221]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
adv
Member

Откуда:
Сообщений: 3333
mesier
adv
Но это не значит, что ПК не нужен. Очень даже нужен.

Зачем он в связующей таблице?
Как по вашему:

Зачем в таблице нужен ПК?
13 окт 11, 11:26    [11432224]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
SergSuper
чтобы Вы могли редактировать на клиенте

Не могли бы вы подробнее разъяснить этот момент? Я с Мускулом недавно, видимо чего-то не знаю..
13 окт 11, 11:29    [11432265]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
adv
mesier
пропущено...
Зачем он в связующей таблице?
Как по вашему:
Зачем в таблице нужен ПК?

Нет уж, сначала вы ответьте на мой вопрос.. ))
13 окт 11, 11:33    [11432308]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
adv
Member

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

ваш вопрос подразумевает, что вы не до конца прочитали определение первичного ключа.

Дочитайте до конца и вопросы отпадут ;)

13 окт 11, 11:35    [11432325]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
arni
Member

Откуда: Иваново
Сообщений: 3544
mesier
Нет уж, сначала вы ответьте на мой вопрос.. ))
поддерживаю.
ПК нужен для однозначной идентификации записи. Нет возможности наложить ПК - тогда о каком адресном удалении или редактировании может идти речь, если не прибегать к низкоуровневым средствам по типу rowid, rdb$db_key etc?
13 окт 11, 11:42    [11432391]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
mesier
SergSuper
чтобы Вы могли редактировать на клиенте

Не могли бы вы подробнее разъяснить этот момент? Я с Мускулом недавно, видимо чего-то не знаю..

да по-моему не только с Мускулом ...
вы хотите отредактировать одну запись, для этого клиент посылает на сервер запрос update ... where ...
если есть первичный ключ, то во where ставится условие по первичному ключу
если первичного ключа нет - какое условие должен ставить клиент?
13 окт 11, 11:43    [11432400]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
adv
Member

Откуда:
Сообщений: 3333
arni
...
Нет возможности наложить ПК
...
Назовите хотя бы одну разумную причину, по которой в рассматриваемом случае может не быть этой возможности.

2mesier
покурите мысль для приведённого примера без ПК:
как будет работать система, если записи в таблице mn будут дублироваться.
или чуть похуже: повторяться раз по стопицот.
13 окт 11, 11:54    [11432541]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54848

SergSuper
если первичного ключа нет - какое условие должен ставить клиент?

Даже древняя вещь по фамилии BDE умела в этих случаях заносить в условие все поля таблицы.
Современные драйвера, оказывается, глупее?..

Posted via ActualForum NNTP Server 1.4

13 окт 11, 12:02    [11432649]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
SergSuper
вы хотите отредактировать одну запись, для этого клиент посылает на сервер запрос update ... where ...
если есть первичный ключ, то во where ставится условие по первичному ключу
если первичного ключа нет - какое условие должен ставить клиент?

Ещё раз обращаю ваше внимание, что речь ведется не о просто таблице с записями, а о связующей таблице в отношении много-ко многим..
Возьмем за основу пример, приведенный adv, и представим, что создаем систему обмена сообщениями.
n - справочник сообщений, m - справочник людей.
mn - таблица получателей сообщений. У каждого получателя может быть много сообщений, каждое сообщение может быть отправлено множеству получателей. В этой таблице может быть ещё поле, обозначающее, допустим, прочитано ли сообщение.
Таким образом однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
Ну и зачем первичный ключ?
Впрочим, если я где-то заблуждаюсь, готов выслушать наставления, только по возможности адекватное, а не как обычно на российских форумах.. ))
13 окт 11, 12:06    [11432694]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
adv
arni
...
Нет возможности наложить ПК
...
Назовите хотя бы одну разумную причину, по которой в рассматриваемом случае может не быть этой возможности.
2mesier
покурите мысль для приведённого примера без ПК:
как будет работать система, если записи в таблице mn будут дублироваться.
или чуть похуже: повторяться раз по стопицот.

Оставьте пожалуйста ваши назидания!..
Наличие или отсутствие отдельного поля под первичный ключ - не гарантия того, что не будет полного совпадения пары вторичных ключей.. Что чаще всего означает ошибку в проекте.
13 окт 11, 12:11    [11432737]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
adv
Member

Откуда:
Сообщений: 3333
mesier
Наличие или отсутствие отдельного поля под первичный ключ - не гарантия того, что не будет полного совпадения пары вторичных ключей..

qwerty112
2
pk - это не обязательно автоинкриментное поле
развивая мысль - это не обязательно дополнительное поле.
13 окт 11, 12:16    [11432799]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
mesier
Member

Откуда: Новокузнецк ► СПб
Сообщений: 1047
adv
mesier
Наличие или отсутствие отдельного поля под первичный ключ - не гарантия того, что не будет полного совпадения пары вторичных ключей..

qwerty112
2
pk - это не обязательно автоинкриментное поле
развивая мысль - это не обязательно дополнительное поле.

Повторяю: но это обязательно уникальное поле.
Что по вновь предложенной вами схеме автоматически превращает отношение many-to-many в many-to-one..
13 окт 11, 12:20    [11432845]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
miksoft
Member

Откуда:
Сообщений: 38921
mesier
однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
Ну и зачем первичный ключ?
Ну так значит "id сообщения и id человека" - это и есть первичный ключ.
13 окт 11, 12:20    [11432850]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
qwerty112
Guest
miksoft
mesier
однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
Ну и зачем первичный ключ?
Ну так значит "id сообщения и id человека" - это и есть первичный ключ.

+1
щас ТС откроет для себя составной ключ :))
13 окт 11, 12:25    [11432908]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
adv
Member

Откуда:
Сообщений: 3333
mesier
n - справочник сообщений, m - справочник людей.
mn - таблица получателей сообщений. У каждого получателя может быть много сообщений, каждое сообщение может быть отправлено множеству получателей. В этой таблице может быть ещё поле, обозначающее, допустим, прочитано ли сообщение.
Таким образом однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
В этом примере уже нельзя 'однозначно идентифицировать запись'.
Гляньте подчёркнутое - по паре i,j не удастся различить 'может быть ещё поле'.
13 окт 11, 12:27    [11432944]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?  [new]
U-gene
Member

Откуда: Москва. Россия
Сообщений: 1576
непонятный спор
в любом случае
либо записи как то отличаются
либо если есть две неотличимые записи - но как тогда понять какую менять надо? надо менять все такие записи

сейчас - можно выполнить UPDATE ... WHERE ... возможно он изменит несколько записей
а вообще - заведи ключ
13 окт 11, 12:30    [11432967]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить