Вопрос по SQL
с базами не каждый год что-то делаю. а если да - то немного.
сейчас хочу связать две таблицы, например, 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);
или я что-то неправильно делаю, или какой тогда смысл в этой ссязке таблиц, если она ведет себя как и без нее?
попутно еще масса вопросов возникает, например, все "заработало". как правильно добавить адрес в таблицу адресов? нужно сперва запрашивать индекс из таблицы имен, или есть некий быстрый "секрентый" способ?
Тебе надо создать foreign key: https://www.w3schools.com/sql/sql_foreignkey.asp
а как же это? из книжки 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, то все красиво (пока).
я так понимаю, что должна была заругаться. а если проглотила - должна выполнить корректно. глючит, понимаю, мария.
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.
Первый пункт как минимум.
нужно сперва запрашивать индекс из таблицы имен, или есть некий быстрый "секрентый" способ?
А как же иначе ты узнаешь ключ? Ну можно, конечно, наугад какое-нибудь число поставить...
Единственный "секретный" способ - это LAST_INSERT_ID, если непосредственно перед добавлением записи в таблицу адресов, добавил запись в таблицу имен.
спасибо, заимею ввиду.
снова непонятка. создаю одну таблицу, и другую. в обеих указываю
create table tablename (id integer not null primary key auto_increment, ...
, но когда потом show crteate table...
, то в одной таблице эта колонка int(11), в в другой - int(10) unsigned. почему, если создавались они одинаково? или что такое тогда integer?
хм... тоже не воспроизводится. пока. наверное, что-то намутил. забудем, если не всплывет.
спасибо и извините, что морочу голову примитивами. мне нужно "один раз сделать, чтоб заработало, и забыть". я так всегда с базами, с ними работать мне не нравится.
мне нужно "один раз сделать, чтоб заработало, и забыть".
а зачем тогда в SQL всё делать? Сколько с базами не работал, тоже раз на раз, никогда "вручную" таблицы не создавал
phpmyadmin для марии на сервере или какой другой тул или прямо с редактора диаграмм (ER Editor)
Вот самый любимый (до 10 таблиц бесплатно)
проблемы? сперва подумал, что это - здорово: вот сейчас возьму и наклацаю себе базу.
если просто таблички создавать, никаких проблемов. а когда захотел их связать, не нашел вообще никаких кнопок, где и как это можно сделать. ни добавить foreign key, ни убрать. а с командами можно разобраться. мне их один раз выдать нужно, и то проще поисков куда клацнуть. а если бы делал это регулярно, команды были бы единственным удобным методом : )
они, собственно, такими и остаются.
не нашел вообще никаких кнопок
еся
https://folkprog.net/sozdanie-svyazey-phpmyadmin/
команды были бы единственным удобным методом
Не переношу команды во всех их проявлениях. Только в исключительных случаях пользую. Но это мой персональный бзик
может и еся, но в описании команды прописано, как ее ввести, чтобы получить искомый результат. а в этой штучке - нужно искать кнопочки, которые с названиями, ни о чем не говорящими, нужно изучать "секретный код", в общем, осваивать какую-то новую кнопочную технологию. не люблю, как вы - команды. я - за ясность и простоту : )
но в описании команды прописано
вот вишь - нужно искать описание команды. А кнопы почти всегда можно найти без всякого описания. Просто у меня уже на автомате, что для связи нужно вначале все ключи сделать.
Хотя вручную обычно и не делаю. Рисую все в редакторе, а после просто генерирую из него SQL, который запускаю в phpmyadmin.
Создаем первую таблицу;
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);
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);
так сработает
Для работы с базами данных существует ряд как бы нотаций. Во первых имена таблиц в единственном числе address, а не addresses. Во вторых поле с primary key всегда просто id. Не id_name, а просто id. Но это на любителя и имхо. Хотя подобные правила потом очень облегчают жизнь кодерам.
Для меня база данных это просто хранилище и я, как программист, вообще как правило в программах использую персистентный слой, который и базы даннвх строит и sql сам генерирует и за целостьностью данных следит.
SQL как язык знать надо. Имхо. Это стандарт. Хотя бы потому, что на многих фирмах просто запрещено пользоваться какими то тулами. Есть предписаные проги и все. Выдадут db developer и радуйся.
За исключением того, что имеет предефенированное поле с тем же именем.
Стандартное имя поля это соглашение. Если соглашение невозможно технически, то его просто меняют. Но до тех пор, пока нет проблем, нет смысла проблемы придумывать и придумывать исключения-решения этих высосанных из пальцы проблем.
На крайняк можно погуглить. Например здесь
https://www.petefreitag.com/tools/sql_reserved_words_check...
кстати, не сработало. как не срабатывает и это. докумунтированное (говорят)
alter table tablename rename column oldname to newname;
текст сообщения как всегда идиотский. т.е. все равно что его бы вообще не было. возможно, было бы даже лучше.
как народ работает с этими субд? повбивавби (с)
как не срабатывает и это. докумунтированное (говорят)
alter table tablename rename column oldname to newname;
https://mariadb.com/kb/en/alter-table/
Проверяем версию: select version();
кстати, не сработало. как не срабатывает и это. докумунтированное (говорят)
Мир не идеален. Я решаю конкретные проблемы. Если у тебя не получается изменить имя столбца, то можно попробовать. Нужно имя базы данных и сообщение о ошибке. Если нужно восстановить вселенскую справедливость, то пожалуй я для этого слабоват. Рожей не вышел.
на форумах фраз нахватались, или сами составлять такое умеете?
Ок. Я просто хотел сказать, что многие продукты нелогичны или кажутся таковыми при первом использовании. И что я привык просто искать решения таких проблем в инете. Не особо заморачиваясь вопросом, как вообще жить в таких условиях.
Если будет нужна конкретная помощь по SQL, я попробую помочь, чем смогу.
возникла проблема при работе с 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 и соединяюсь с базой - никаких проблем, как и раньше.
что такого могло случиться?
клиент - на моем компе.
как часто случается, стоит позвать на помощь, как проблема тут же сама собой разрулёвывается : )
гоголь все выводил на какие-то SSL проблемы, сертификаты и пр. решил побаловаться с параметрами, и вот, указав просто SSL Mode=None, удалось все решить. видимо, на сервере что-то подкрутили за это время, раньше что-то было по умолчанию, даже слушать и знать не хочу что именно. важно, что все теперь идет замечательно. до следующего раза : )
Ну здорово, если всё получилось.
А под какой операционнкой всё крутится?
Потому как, если никсы, отчего C#? А если винда, то отчего MySql? Просто интересно, у меня была где то аналогичная проблема, но там была MySql была на удалённом линукс сервере, а клиент на винде.
MySQL Connector Net
Ооо помню это, в колледже заставляли почему-то MySQL Connector для NET изучать. Вот https://stackoverflow.com/questions/5178757/system-io-ioex...