powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / constraints
16 сообщений из 16, страница 1 из 1
constraints
    #38947170
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть две таблицы и вопросы по ним:

1) стоит ли вводить countryID (с автоинкрементом например) и делать привязку по countryID вместо cntry_code (аргументировать)

2) foreign key constraint: хочу добиться следующего:
а) при внесении/исправлении записи в таблицу population проверяется наличие соотв. cntry_code в таблице country
b) удаление записей в таблице country запрещено, если в таблице population имееются записи с соотв. cntry_code
c) исправление cntry_code в таблице country запрещено, если в таблице population имееются записи с соотв. cntry_code
d) исправление cntry_name в таблице country разрешено

выполняются ли заданные условия в моих таблицах (код см. ниже)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Table Name: country

CREATE TABLE IF NOT EXISTS country
(
  cntry_code CHAR(3) NOT NULL,
  cntry_name VARCHAR(45 NOT NULL,
  PRIMARY KEY (cntry_code),
  INDEX ( cntry_name(3) )
) ENGINE = INNODB;

// Table Name: population

CREATE TABLE IF NOT EXISTS population 
(
  cntry_code CHAR(2) NOT NULL,
  year INT(4) NOT NULL,
  population FLOAT,
  UNIQUE (cntry_code, year),
  FOREIGN KEY (cntry_code) REFERENCES country(cntry_code)
) ENGINE=INNODB;
...
Рейтинг: 0 / 0
constraints
    #38947179
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
в таблице country должно быть

Код: sql
1.
cntry_code CHAR(2) NOT NULL,
...
Рейтинг: 0 / 0
constraints
    #38947189
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас реализован первый вариант, т.е. с числовым ID. Но у нас это сделано в первую очередь для унификации кода клиентской программы, чтобы работа со всеми справочниками была одинаковой. Разумеется, foreign key создан. Записи из таблицы стран никогда не удаляются и практически никогда не редактируются.
...
Рейтинг: 0 / 0
constraints
    #38947196
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Кстати, у стран бывают двухбуквенные, трехбуквенные и числовые (из трех цифр) коды (например, ОКСМ ). В разных документах используются разные коды.
...
Рейтинг: 0 / 0
constraints
    #38947234
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
спасибо, я начну с двухбуквенного , а там посмотрим (если что, сделаем дополнительную табличку-переходник)
двухбуквенный вариант: интуитивный + более экономичный (таблиц будет много, по разным статистическим показателям)

=)
...
Рейтинг: 0 / 0
constraints
    #38947259
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabинтуитивныйВ лучшем случае для десятка-другого стран. Разгадайте интуитивно код "EH" :)mini.weblabболее экономичныйЧто так два байта, что эдак.

Еще может быть вариант, когда существует ссылка на объект, которого нет в стандарте. У нас, например, есть ЕС (Евросоюз), у которого нет соответствия в ОКСМ.
...
Рейтинг: 0 / 0
constraints
    #38947265
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И VARCHAR(45) не хватит даже для краткого наименования. Можете смело делать VARCHAR(255).
...
Рейтинг: 0 / 0
constraints
    #38947269
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1) стоит ли вводить countryID (с автоинкрементом например) и делать привязку по countryID вместо cntry_code (аргументировать)

Да, стоит. Первичный ключ не должен иметь никакой смысловой нагрузки предметной области.
cntry_code нужно в таком случае оставить как альтернативный ключ (UNIQUE). Кстати, кодировок стран несколько, так что
будет 2-3 таких ключа.

автор2) foreign key constraint: хочу добиться следующего:
а) при внесении/исправлении записи в таблицу population проверяется наличие соотв. cntry_code в таблице country
b) удаление записей в таблице country запрещено, если в таблице population имееются записи с соотв. cntry_code
c) исправление cntry_code в таблице country запрещено, если в таблице population имееются записи с соотв. cntry_code
d) исправление cntry_name в таблице country разрешено

Вот от этого всего и позволяет избавится суррогатный первичный ключ по автогенерируемому номеру.
После его введения тебе останется только создать обычный FOREIGN KEY CONSTRAINT с population на country.

авторвыполняются ли заданные условия в моих таблицах (код см. ниже)

Это:
Код: plaintext
1.
2.
3.
а) при внесении/исправлении записи в таблицу population проверяется наличие соотв. cntry_code в таблице country
b) удаление записей в таблице country запрещено, если в таблице population имееются записи с соотв. cntry_code
d) исправление cntry_name в таблице country разрешено
выполняется.

А это:
Код: plaintext
1.
c) исправление cntry_code в таблице country запрещено, если в таблице population имееются записи с соотв. cntry_code
не вполне.

"Не вполне" потому что ты можешь поменять записи так, что в итоге всё будет хорошо, но в процессе -- нет.
Да и вообще -- cntry_code у тебя -- PRIMARY KEY (cntry_code), а PK менять нельзя .
...
Рейтинг: 0 / 0
constraints
    #38947421
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
спасибо, будем исправлять
...
Рейтинг: 0 / 0
constraints
    #38947506
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мысль по поводу PK поняла, но все-таки сделать первичный буквенный ключ (аналогия автоинкремента) очень заманчиво, именно из-за большей интуитивности и относительно небольшого размера таблицы. Все-таки US, DE, FR более привычно чем 78, 2, 211 =)
и опять же ничто не мешает, добавить стандартные сокращения, например
cntry_code / cntry_name / std01 / std02
...
Рейтинг: 0 / 0
constraints
    #38947565
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabмысль по поводу PK поняла, но все-таки сделать первичный буквенный ключ (аналогия автоинкремента) очень заманчиво, именно из-за большей интуитивности и относительно небольшого размера таблицы. Все-таки US, DE, FR более привычно чем 78, 2, 211 =)


Так в чём проблема сделать это альтернативным ключём?
Всё будет привычно, интуитивно, и т.п.
Лишний JOIN -- не проблема.
...
Рейтинг: 0 / 0
constraints
    #38947599
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
а как это сделать ?
...
Рейтинг: 0 / 0
constraints
    #38947623
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS country
(
  cntry_id int identity NOT NULL,
  cntry_code CHAR(2) NOT NULL,
  cntry_code3 CHAR(3) NOT NULL,
  cntry_name VARCHAR(45 NOT NULL,
  PRIMARY KEY (cntry_id),
  UNIQUE (cntry_code),
  UNIQUE ( cntry_code3 )
  index(cntry_name(6))
) ENGINE = INNODB;
...
Рейтинг: 0 / 0
constraints
    #38947630
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
спасибо
...
Рейтинг: 0 / 0
constraints
    #38947983
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще вопрос по загрузке данных, возвращаемся к таблице population
/ cntry_id / year / population

предположим что регулярно поступают файлы формата
/ cntry_code / cntry_name / year / population
как обычно загружаются данные ? какие могут быть варианты ?

пока думаю сделать так, но не знаю хорошо это будет или нет:

1) создаем загрузочную базу со структурой таблиц соответствующей структурам загружаемых файлов
2) таблицы в загрузочной базе будут пустыми (только структуры)
3) получаем файлы - грузим в загрузочную базу
4) из загрузочной базы грузим все в основную базу
5) убеждаемся, что все хорошо
6) стираем данные в загрузочной базе
...
Рейтинг: 0 / 0
constraints
    #38948068
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftРазгадайте интуитивно код "EH" :)ЕНгланд!
mini.weblabпока думаю сделать так, но не знаю хорошо это будет или нет:Нормально.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / constraints
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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