Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Вопрос по SQL

2535  1 2 3 все
  moose коренной житель02.06.20 14:31
02.06.20 14:31 
Последний раз изменено 02.06.20 14:40 (moose)

с базами не каждый год что-то делаю. а если да - то немного.

сейчас хочу связать две таблицы, например, table0, table1, чтобы одна из колонок нулевой ссылалась на праймери кии из первой. прочитал, как это можно сделать. вроде бы так


create table names (id_name integer not null primary key auto_increment, name char(10));

create table addresses (id_address integer not null primary key auto_increment, address char(100), id_name integer references table1(id1);


таблицы создаются, но:

show create table addresses;

выдает команду, где ни намека на рифэрэнс, как его и не было

могу без проблем добавить такую запись:


insert into adresses values (null, 'address', 222);


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


попутно еще масса вопросов возникает, например, все "заработало". как правильно добавить адрес в таблицу адресов? нужно сперва запрашивать индекс из таблицы имен, или есть некий быстрый "секрентый" способ?

#1 
NightWatch коренной житель02.06.20 14:55
NightWatch
NEW 02.06.20 14:55 
в ответ moose 02.06.20 14:31

Что за DBMS?

#2 
Программист коренной житель02.06.20 16:21
NEW 02.06.20 16:21 
в ответ moose 02.06.20 14:31

Тебе надо создать foreign key: https://www.w3schools.com/sql/sql_foreignkey.asp

#3 
  moose коренной житель02.06.20 17:32
NEW 02.06.20 17:32 
в ответ NightWatch 02.06.20 14:55

mysql (mariadb)

#4 
NightWatch коренной житель02.06.20 17:35
NightWatch
NEW 02.06.20 17:35 
в ответ Программист 02.06.20 16:21
Тебе надо создать foreign key

Если не учитывать ошибки (в том числе синтаксические), то он это и делает с помощью inline constraint

id_name integer references table1(id1)

#5 
  moose коренной житель02.06.20 17:38
NEW 02.06.20 17:38 
в ответ Программист 02.06.20 16:21, Последний раз изменено 02.06.20 17:45 (moose)

а как же это? из книжки martin gruber 'understanding sql':


ch. 19foreign key as a column constraintthe column-constraint version of the foreign key constraint is also called the references constraint, because it does not actually contain the words foreign key; it simply uses the word references, and then names the parent key, like this:

create table customers (cnum integer not null primary key, cname char(10, city char(10), snum integer references salespeople(snum) );

the above defines customers.snum as a foreign key whose parent key is salespeople.snum. it is equivalent to this table constraint:

foreign key (snum) referendex salespeople (snum)

я думал, раз не заругалась база при создатии таким образом, значит должно иметь какой-то эффект, а оно, как немцы говорят, ин ди хозэ : (


но проверил: если задать как foreign key as a TABLE constraint, то все красиво (пока).

я так понимаю, что должна была заругаться. а если проглотила - должна выполнить корректно. глючит, понимаю, мария.


#6 
NightWatch коренной житель02.06.20 17:40
NightWatch
NEW 02.06.20 17:40 
в ответ moose 02.06.20 17:32, Последний раз изменено 02.06.20 17:49 (NightWatch)

https://mariadb.com/kb/en/foreign-keys/


1. Note: MariaDB accepts the REFERENCES clause in ALTER TABLE and CREATE TABLE statements, but that syntax does nothing. MariaDB simply parses it without returning any error or warning, for compatibility with other DBMS's. However, only the syntax described below creates foreign keys.

2. Currently, foreign keys are only supported by InnoDB.

3. Foreign key constraints can be disabled by setting the foreign_key_checks server system variable to 0.


Первый пункт как минимум.

#7 
  moose коренной житель02.06.20 17:59
NEW 02.06.20 17:59 
в ответ NightWatch 02.06.20 17:40

супер! задокументированный глюк уже как бы и не глюк, а почти что фича : )

warning должны бы выдать.

#8 
NightWatch коренной житель02.06.20 18:13
NightWatch
NEW 02.06.20 18:13 
в ответ moose 02.06.20 14:31
нужно сперва запрашивать индекс из таблицы имен, или есть некий быстрый "секрентый" способ?

А как же иначе ты узнаешь ключ? Ну можно, конечно, наугад какое-нибудь число поставить...

Единственный "секретный" способ - это LAST_INSERT_ID, если непосредственно перед добавлением записи в таблицу адресов, добавил запись в таблицу имен.

#9 
  moose коренной житель02.06.20 18:26
NEW 02.06.20 18:26 
в ответ NightWatch 02.06.20 18:13

спасибо, заимею ввиду.

снова непонятка. создаю одну таблицу, и другую. в обеих указываю


create table tablename (id integer not null primary key auto_increment, ...

, но когда потом show crteate table...

, то в одной таблице эта колонка int(11), в в другой - int(10) unsigned. почему, если создавались они одинаково? или что такое тогда integer?


#10 
NightWatch коренной житель02.06.20 19:22
NightWatch
NEW 02.06.20 19:22 
в ответ moose 02.06.20 18:26
  moose коренной житель02.06.20 20:53
NEW 02.06.20 20:53 
в ответ NightWatch 02.06.20 19:22

хм... тоже не воспроизводится. пока. наверное, что-то намутил. забудем, если не всплывет.

спасибо и извините, что морочу голову примитивами. мне нужно "один раз сделать, чтоб заработало, и забыть". я так всегда с базами, с ними работать мне не нравится.

#12 
AlexNek патриот03.06.20 22:22
AlexNek
NEW 03.06.20 22:22 
в ответ moose 02.06.20 20:53
мне нужно "один раз сделать, чтоб заработало, и забыть".

а зачем тогда в SQL всё делать? Сколько с базами не работал, тоже раз на раз, никогда "вручную" таблицы не создавал смущ

phpmyadmin для марии на сервере или какой другой тул или прямо с редактора диаграмм (ER Editor)

Вот самый любимый (до 10 таблиц бесплатно)

https://www.devart.com/entitydeveloper/

#13 
  moose коренной житель03.06.20 22:35
NEW 03.06.20 22:35 
в ответ AlexNek 03.06.20 22:22
phpmyadmin

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


#14 
AlexNek патриот03.06.20 23:01
AlexNek
NEW 03.06.20 23:01 
в ответ moose 03.06.20 22:35
дубовейшай весчь

А какие у Вас с ним проблемы? Пока особых не замечал. Всё что нужно вполне удобно можно делать. Но у меня аллергия на "команды" смущ

Даже большие базы без SSH как то перекидывал.


#15 
  moose коренной житель04.06.20 20:53
NEW 04.06.20 20:53 
в ответ AlexNek 03.06.20 23:01

проблемы? сперва подумал, что это - здорово: вот сейчас возьму и наклацаю себе базу.

если просто таблички создавать, никаких проблемов. а когда захотел их связать, не нашел вообще никаких кнопок, где и как это можно сделать. ни добавить foreign key, ни убрать. а с командами можно разобраться. мне их один раз выдать нужно, и то проще поисков куда клацнуть. а если бы делал это регулярно, команды были бы единственным удобным методом : )

они, собственно, такими и остаются.

#16 
AlexNek патриот04.06.20 21:22
AlexNek
NEW 04.06.20 21:22 
в ответ moose 04.06.20 20:53
не нашел вообще никаких кнопок

еся

https://folkprog.net/sozdanie-svyazey-phpmyadmin/


команды были бы единственным удобным методом

Не переношу команды во всех их проявлениях. Только в исключительных случаях пользую. Но это мой персональный бзик смущ

#17 
  moose коренной житель04.06.20 21:59
NEW 04.06.20 21:59 
в ответ AlexNek 04.06.20 21:22, Последний раз изменено 04.06.20 22:00 (moose)

может и еся, но в описании команды прописано, как ее ввести, чтобы получить искомый результат. а в этой штучке - нужно искать кнопочки, которые с названиями, ни о чем не говорящими, нужно изучать "секретный код", в общем, осваивать какую-то новую кнопочную технологию. не люблю, как вы - команды. я - за ясность и простоту : )

#18 
AlexNek патриот04.06.20 23:40
AlexNek
NEW 04.06.20 23:40 
в ответ moose 04.06.20 21:59
но в описании команды прописано

вот вишь - нужно искать описание команды. А кнопы почти всегда можно найти без всякого описания. Просто у меня уже на автомате, что для связи нужно вначале все ключи сделать.

Хотя вручную обычно и не делаю. Рисую все в редакторе, а после просто генерирую из него SQL, который запускаю в phpmyadmin.

#19 
koder патриот05.06.20 07:11
koder
NEW 05.06.20 07:11 
в ответ moose 02.06.20 14:31

Создаем первую таблицу;


CREATE TABLE names(
id_name integer not null primary key auto_increment,
name char(10)
);


Создаем вторую таблицу;
create table addresses (id_address integer not null primary key auto_increment,
address char(100),
id_name integer );


Соединяем таблицы;
ALTER TABLE
addresses
ADD CONSTRAINT
fk_addresses_names_id
FOREIGN KEY (id_name) REFERENCES names(id_name);

#20 
koder патриот05.06.20 07:15
koder
NEW 05.06.20 07:15 
в ответ koder 05.06.20 07:11, Последний раз изменено 05.06.20 07:20 (koder)

insert into addresses values (null, 'address', 222);


Пытаемся положить адрес к имени, которого не существует. Получаем ошибку

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails


Защита работает.

................................................................................

insert into names values (null, 'aaaaa');
insert into addresses values (null, 'bbbbbb', 1);


так сработает


#21 
koder патриот05.06.20 07:19
koder
NEW 05.06.20 07:19 
в ответ koder 05.06.20 07:15, Последний раз изменено 05.06.20 07:26 (koder)

Для работы с базами данных существует ряд как бы нотаций. Во первых имена таблиц в единственном числе address, а не addresses. Во вторых поле с primary key всегда просто id. Не id_name, а просто id. Но это на любителя и имхо. Хотя подобные правила потом очень облегчают жизнь кодерам.


Для меня база данных это просто хранилище и я, как программист, вообще как правило в программах использую персистентный слой, который и базы даннвх строит и sql сам генерирует и за целостьностью данных следит.


SQL как язык знать надо. Имхо. Это стандарт. Хотя бы потому, что на многих фирмах просто запрещено пользоваться какими то тулами. Есть предписаные проги и все. Выдадут db developer и радуйся.

#22 
Murr патриот05.06.20 13:17
Murr
NEW 05.06.20 13:17 
в ответ koder 05.06.20 07:19

Во вторых поле с primary key всегда просто id.

------

IDs - не все базы разрешают id - где-то зарезервированно.

#23 
koder патриот05.06.20 13:21
koder
NEW 05.06.20 13:21 
в ответ Murr 05.06.20 13:17
IDs - не все базы разрешают id - где-то зарезервированно.

Например?

#24 
Murr патриот06.06.20 03:17
Murr
NEW 06.06.20 03:17 
в ответ koder 05.06.20 13:21

Например?

-----

Не помню. Спотыкался об это в 2005.

#25 
koder патриот06.06.20 12:16
koder
NEW 06.06.20 12:16 
в ответ Murr 06.06.20 03:17
Спотыкался об это в 2005.


Понятно. Но это наверно год был такой 😁

#26 
MrSanders коренной житель06.06.20 16:27
NEW 06.06.20 16:27 
в ответ koder 06.06.20 12:16

если уж DB2 zOS разрешало ID использовать, то точно всё что сейчас на рынке есть переварит такое имя. Разве в 90-х какой-нибудь foxpro или clipper запрещал. Не помню чтобы с ними проблемы были. Имена полей максимум 10 символов, это помню :)

#27 
Murr патриот06.06.20 20:24
Murr
NEW 06.06.20 20:24 
в ответ MrSanders 06.06.20 16:27

то точно всё что сейчас на рынке есть переварит такое имя.

-----

Все.

За исключением того, что имеет предефенированное поле с тем же именем.

Изменилось это или нет не знаю, не смотрел - просто поменяли ИД на ИДС и забыли...

#28 
koder патриот07.06.20 07:36
koder
NEW 07.06.20 07:36 
в ответ Murr 06.06.20 20:24
За исключением того, что имеет предефенированное поле с тем же именем.

Стандартное имя поля это соглашение. Если соглашение невозможно технически, то его просто меняют. Но до тех пор, пока нет проблем, нет смысла проблемы придумывать и придумывать исключения-решения этих высосанных из пальцы проблем.


На крайняк можно погуглить. Например здесь

https://www.petefreitag.com/tools/sql_reserved_words_check...

#29 
Murr патриот07.06.20 18:16
Murr
NEW 07.06.20 18:16 
в ответ koder 07.06.20 07:36

Если соглашение невозможно технически, то его просто меняют.

-----

Именно это мы и сделали когда наткнулись на проблему.

#30 
  moose коренной житель07.06.20 21:26
NEW 07.06.20 21:26 
в ответ koder 05.06.20 07:19

спасибо, не знал этих всех вещей. почитал это, там очень много всякого, для меня нерелевантного. но постараюсь придерживаться, если вспомню. наверняка выработано практикой.

#31 
  moose коренной житель08.06.20 21:25
NEW 08.06.20 21:25 
в ответ koder 05.06.20 07:11

кстати, не сработало. как не срабатывает и это. докумунтированное (говорят)


alter table tablename rename column oldname to newname;


текст сообщения как всегда идиотский. т.е. все равно что его бы вообще не было. возможно, было бы даже лучше.

как народ работает с этими субд? повбивавби (с)

#32 
NightWatch коренной житель08.06.20 23:05
NightWatch
NEW 08.06.20 23:05 
в ответ moose 08.06.20 21:25
как не срабатывает и это. докумунтированное (говорят)
alter table tablename rename column oldname to newname;

https://mariadb.com/kb/en/alter-table/

Проверяем версию: select version();

#33 
koder патриот09.06.20 07:08
koder
NEW 09.06.20 07:08 
в ответ moose 08.06.20 21:25
кстати, не сработало. как не срабатывает и это. докумунтированное (говорят)

Мир не идеален. Я решаю конкретные проблемы. Если у тебя не получается изменить имя столбца, то можно попробовать. Нужно имя базы данных и сообщение о ошибке. Если нужно восстановить вселенскую справедливость, то пожалуй я для этого слабоват. Рожей не вышел. хаха

#34 
  moose коренной житель09.06.20 22:08
NEW 09.06.20 22:08 
в ответ koder 09.06.20 07:08
Если нужно восстановить вселенскую справедливость, то пожалуй я для этого слабоват.

на форумах фраз нахватались, или сами составлять такое умеете?


Рожей не вышел.

а что с ней не так? выставляйте фото, обсудим. может что-то предпринять не поздно : )


#35 
koder патриот10.06.20 07:19
koder
NEW 10.06.20 07:19 
в ответ moose 09.06.20 22:08
на форумах фраз нахватались, или сами составлять такое умеете?

Ок. Я просто хотел сказать, что многие продукты нелогичны или кажутся таковыми при первом использовании. И что я привык просто искать решения таких проблем в инете. Не особо заморачиваясь вопросом, как вообще жить в таких условиях.

Если будет нужна конкретная помощь по SQL, я попробую помочь, чем смогу.

#36 
  moose коренной житель18.06.20 20:50
NEW 18.06.20 20:50 
в ответ koder 10.06.20 07:19

вы мне уже конкретно помогли, спасибо!

я просто, как заглядывающий изредка, полагал, что здесь все как в газете: если написано - все правда : )


#37 
  moose коренной житель10.10.20 19:54
NEW 10.10.20 19:54 
в ответ moose 18.06.20 20:50

возникла проблема при работе с mysql.

собственно, не SQL касается, но тему не хочу новую открывать.

есть у меня прога, которая связывается с сервером (mariaDB), читает оттуда что-то и показывает, в общем это не важно. она вдруг перестала работать.

использую в C# библиотеку MySQL Connector Net 6.9.11.

_connection = new MySqlConnection(connectionString);

проходит на ура, а
_connection.Open();

бросается прерывание

System.IO.IOException: 'The handshake failed due to an unexpected packet format.'

если запускаю в консоли mysql.exe и соединяюсь с базой - никаких проблем, как и раньше.

что такого могло случиться?


#38 
AlexNek патриот10.10.20 21:36
AlexNek
NEW 10.10.20 21:36 
в ответ moose 10.10.20 19:54

А база и клиент на разных серверах?

Обновы были какие то в последнее время?

Порты/ фаервол не менялись?


Я вот только не помню отчего я энту штуку не пользовал, или еще не было или что то не получалось смущ

#39 
  moose коренной житель10.10.20 22:57
NEW 10.10.20 22:57 
в ответ AlexNek 10.10.20 21:36

клиент - на моем компе.

как часто случается, стоит позвать на помощь, как проблема тут же сама собой разрулёвывается : )

гоголь все выводил на какие-то SSL проблемы, сертификаты и пр. решил побаловаться с параметрами, и вот, указав просто SSL Mode=None, удалось все решить. видимо, на сервере что-то подкрутили за это время, раньше что-то было по умолчанию, даже слушать и знать не хочу что именно. важно, что все теперь идет замечательно. до следующего раза : )

#40 
AlexNek патриот10.10.20 23:08
AlexNek
NEW 10.10.20 23:08 
в ответ moose 10.10.20 22:57

Ну здорово, если всё получилось.

А под какой операционнкой всё крутится?

Потому как, если никсы, отчего C#? А если винда, то отчего MySql? Просто интересно, у меня была где то аналогичная проблема, но там была MySql была на удалённом линукс сервере, а клиент на винде.


#41 
uscheswoi_82 постоялец10.10.20 23:39
NEW 10.10.20 23:39 
в ответ moose 10.10.20 19:54
MySQL Connector Net

Ооо помню это, в колледже заставляли почему-то MySQL Connector для NET изучать. Вот https://stackoverflow.com/questions/5178757/system-io-ioex...

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#42 
  moose коренной житель10.10.20 23:41
NEW 10.10.20 23:41 
в ответ AlexNek 10.10.20 23:08

база - у провайдера. сервер под линухом. mysql.

михаил светлов клиент - это я


...

клиент у меня под уиндоуз. похоже, как и у вас где-то : )

#43 
  moose коренной житель10.10.20 23:58
NEW 10.10.20 23:58 
в ответ uscheswoi_82 10.10.20 23:39
Ооо помню это, в колледже заставляли почему-то MySQL Connector для NET изучать.



#44 
1 2 3 все