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

Вопрос по SQL

2535  1 2 3 все
  moose коренной житель02.06.20 14:31
NEW 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
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 
1 2 3 все