Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key? / 25 сообщений из 49, страница 1 из 2
13.10.2011, 08:48
    #37479928
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
Столкнулся с проблемой, что связующая таблица в отношении many-to-many не редактируется (UPDATE). Короткое гугление привело к открытию, что это исключительно из-за того, что у этой таблицы не было primary key поля.
По идее pk в такой таблице не нужен.. Но пришлось сделать (при этом не использовать). Раньше я работал в основном с Oracle, там такой проблемы не было, там других граблей хватало (чего только работа с датами и таймстампами стоит!)

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

А как вы реализуете отношение many-to-many в MySQL ?
...
Рейтинг: 0 / 0
13.10.2011, 10:37
    #37480095
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
я с MySQL не знаком, но по-моему это ошибки не сервера, а клиента
...
Рейтинг: 0 / 0
13.10.2011, 10:38
    #37480099
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
Не редактируется клиентом (читай автогенерилкой инструкций механизмом доступа к данным) и не выполнятеся UPDATE - суть две большие разницы. У Вас первый случай.
...
Рейтинг: 0 / 0
13.10.2011, 10:49
    #37480128
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
Так от этого же не легче!
...
Рейтинг: 0 / 0
13.10.2011, 10:52
    #37480131
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesier,

вкраце:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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 

Но это не значит, что ПК не нужен.
Очень даже нужен.
...
Рейтинг: 0 / 0
13.10.2011, 11:00
    #37480149
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesierПо идее pk в такой таблице не нужен..
1
pk нужен всегда
2
pk - это не обязательно автоинкриментное поле
...
Рейтинг: 0 / 0
13.10.2011, 11:19
    #37480213
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
advmesier,
Код: plaintext
1.
2.
3.
4.
5.
6.
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 Но это не значит, что ПК не нужен. Очень даже нужен.
Зачем он в связующей таблице?
...
Рейтинг: 0 / 0
13.10.2011, 11:21
    #37480223
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
qwerty112mesierПо идее pk в такой таблице не нужен..
1
pk нужен всегда
Вопрос тот же - зачем он в связующей таблице отношения many-to-many?
qwerty1122
pk - это не обязательно автоинкриментное поле
Но всегда уникальное. Что сводит на нет использование его в данном случае..

Впрочем, вопрос остается открытым: если знаете как реализовать много-ко-многим по другому, более рационально - с удовольствием выслушаю!
...
Рейтинг: 0 / 0
13.10.2011, 11:26
    #37480234
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesierqwerty112пропущено...

1
pk нужен всегда
Вопрос тот же - зачем он в связующей таблице отношения many-to-many?
что бы Вам было легче и Вы могли редактировать на клиенте
а так, если таблица не предполагает редактирования - не нужен
...
Рейтинг: 0 / 0
13.10.2011, 11:26
    #37480235
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesieradv Но это не значит, что ПК не нужен. Очень даже нужен.
Зачем он в связующей таблице?Как по вашему:

Зачем в таблице нужен ПК?
...
Рейтинг: 0 / 0
13.10.2011, 11:29
    #37480246
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
SergSuper чтобы Вы могли редактировать на клиенте
Не могли бы вы подробнее разъяснить этот момент? Я с Мускулом недавно, видимо чего-то не знаю..
...
Рейтинг: 0 / 0
13.10.2011, 11:33
    #37480255
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
advmesierпропущено...
Зачем он в связующей таблице?Как по вашему:
Зачем в таблице нужен ПК?
Нет уж, сначала вы ответьте на мой вопрос.. ))
...
Рейтинг: 0 / 0
13.10.2011, 11:35
    #37480259
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesier,

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

Дочитайте до конца и вопросы отпадут ;)
...
Рейтинг: 0 / 0
13.10.2011, 11:42
    #37480274
arni
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesierНет уж, сначала вы ответьте на мой вопрос.. )) поддерживаю.
ПК нужен для однозначной идентификации записи. Нет возможности наложить ПК - тогда о каком адресном удалении или редактировании может идти речь, если не прибегать к низкоуровневым средствам по типу rowid, rdb$db_key etc?
...
Рейтинг: 0 / 0
13.10.2011, 11:43
    #37480276
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesierSergSuper чтобы Вы могли редактировать на клиенте
Не могли бы вы подробнее разъяснить этот момент? Я с Мускулом недавно, видимо чего-то не знаю..
да по-моему не только с Мускулом ...
вы хотите отредактировать одну запись, для этого клиент посылает на сервер запрос update ... where ...
если есть первичный ключ, то во where ставится условие по первичному ключу
если первичного ключа нет - какое условие должен ставить клиент?
...
Рейтинг: 0 / 0
13.10.2011, 11:54
    #37480297
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
arni...
Нет возможности наложить ПК
...Назовите хотя бы одну разумную причину, по которой в рассматриваемом случае может не быть этой возможности.

2mesier
покурите мысль для приведённого примера без ПК:
как будет работать система, если записи в таблице mn будут дублироваться.
или чуть похуже: повторяться раз по стопицот.
...
Рейтинг: 0 / 0
13.10.2011, 12:02
    #37480319
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
SergSuperесли первичного ключа нет - какое условие должен ставить клиент?

Даже древняя вещь по фамилии BDE умела в этих случаях заносить в условие все поля таблицы.
Современные драйвера, оказывается, глупее?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.10.2011, 12:06
    #37480331
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
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
Ну и зачем первичный ключ?
Впрочим, если я где-то заблуждаюсь, готов выслушать наставления, только по возможности адекватное, а не как обычно на российских форумах.. ))
...
Рейтинг: 0 / 0
13.10.2011, 12:11
    #37480343
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
advarni...
Нет возможности наложить ПК
...Назовите хотя бы одну разумную причину, по которой в рассматриваемом случае может не быть этой возможности.
2mesier
покурите мысль для приведённого примера без ПК:
как будет работать система, если записи в таблице mn будут дублироваться.
или чуть похуже: повторяться раз по стопицот.
Оставьте пожалуйста ваши назидания!..
Наличие или отсутствие отдельного поля под первичный ключ - не гарантия того, что не будет полного совпадения пары вторичных ключей.. Что чаще всего означает ошибку в проекте.
...
Рейтинг: 0 / 0
13.10.2011, 12:16
    #37480367
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesierНаличие или отсутствие отдельного поля под первичный ключ - не гарантия того, что не будет полного совпадения пары вторичных ключей..
qwerty1122
pk - это не обязательно автоинкриментное поле развивая мысль - это не обязательно дополнительное поле.
...
Рейтинг: 0 / 0
13.10.2011, 12:20
    #37480385
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
advmesierНаличие или отсутствие отдельного поля под первичный ключ - не гарантия того, что не будет полного совпадения пары вторичных ключей..
qwerty1122
pk - это не обязательно автоинкриментное поле развивая мысль - это не обязательно дополнительное поле.
Повторяю: но это обязательно уникальное поле.
Что по вновь предложенной вами схеме автоматически превращает отношение many-to-many в many-to-one..
...
Рейтинг: 0 / 0
13.10.2011, 12:20
    #37480388
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesier однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
Ну и зачем первичный ключ?Ну так значит "id сообщения и id человека" - это и есть первичный ключ.
...
Рейтинг: 0 / 0
13.10.2011, 12:25
    #37480408
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
miksoftmesier однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
Ну и зачем первичный ключ?Ну так значит "id сообщения и id человека" - это и есть первичный ключ.
+1
щас ТС откроет для себя составной ключ :))
...
Рейтинг: 0 / 0
13.10.2011, 12:27
    #37480424
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
mesiern - справочник сообщений, m - справочник людей.
mn - таблица получателей сообщений. У каждого получателя может быть много сообщений, каждое сообщение может быть отправлено множеству получателей. В этой таблице может быть ещё поле, обозначающее, допустим, прочитано ли сообщение.
Таким образом однозначно идентифицировать запись можно по одновременному совпадению id сообщения и id человека.. Разве нет?
select * from mn a, n b, m c, where b.i = a.i and c.j = a.j
В этом примере уже нельзя 'однозначно идентифицировать запись'.
Гляньте подчёркнутое - по паре i,j не удастся различить 'может быть ещё поле'.
...
Рейтинг: 0 / 0
13.10.2011, 12:30
    #37480431
U-gene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key?
непонятный спор
в любом случае
либо записи как то отличаются
либо если есть две неотличимые записи - но как тогда понять какую менять надо? надо менять все такие записи

сейчас - можно выполнить UPDATE ... WHERE ... возможно он изменит несколько записей
а вообще - заведи ключ
...
Рейтинг: 0 / 0
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Уникальная херь у Мускула - нельзя апдэйтить запись если в таблице нет поля primary key? / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]