SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.10.2009 13:54:49

napavik
Участник
Зарегистрирован: 21.10.2009
Сообщений: 8

innoDB связянные таблицы

Создаю базу данных:

CREATE TABLE `colors` (
  `cname` varchar(16) NOT NULL,
  PRIMARY KEY (`cname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `forms` (
  `fname` varchar(16) NOT NULL,
  PRIMARY KEY (`fname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `objects` (
  `object_id` int(10) unsigned zerofill DEFAULT NULL,
  `color` varchar(16) DEFAULT NULL,
  `form` varchar(16) NOT NULL,
  KEY `color` (`color`),
  KEY `form` (`form`),
  CONSTRAINT `color` FOREIGN KEY (`color`) REFERENCES `colors` (`cname`),
  CONSTRAINT `form` FOREIGN KEY (`form`) REFERENCES `forms` (`fname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

а когда создаю еще одну таблицу для некоторых спец объектов, но со связями с таблицами colors и forms:

CREATE TABLE `spec_objects` (
  `s_object_id` int(11) NOT NULL,
  `type` varchar(32) NOT NULL,
  `property` int(11) NOT NULL,
  `color` varchar(16) NOT NULL,
  `form` varchar(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

ALTER TABLE `test`.`spec_objects` ADD CONSTRAINT `color` FOREIGN KEY `color` (`color`)
    REFERENCES `colors` (`cname`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT,
ADD CONSTRAINT `form` FOREIGN KEY `form` (`form`)
    REFERENCES `forms` (`fname`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT;

получаю ошбку:

Error executing SQL commands to update table.
MySQL Error Nr. 1005
Can't create table 'test.#sql-1cc2_1' (errno: 121)

нашел ссылки на то что что-то не так в файле настройке, но что именно указано не было
или в INNODB нельзя из двух дочерних таблиц ссылаться на одну родительскую?
а как без INNODB построить реляционную базу?

Неактивен

 

#2 28.10.2009 23:10:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: innoDB связянные таблицы

Ну, во-первых, при создании внешних ключей нужно, чтобы были индексы по
соответствующим столбцам в обеих таблицах. Если Вы создаете внешний ключ
в команде, которая создает таблицу, то сам индекс неявно создается MySQL. Иначе
это нужно делать явно. Ну и с именами надо разобраться, т.е. после добавления
индексов команда ALTER TABLE `spec_objects` ADD FOREIGN KEY (`color`) ... у меня
заработала, а с явным указанием названия связи — нет. Второе, конечно, бага,
но, кажется, не очень значительная.

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

Неактивен

 

#3 29.10.2009 08:22:30

napavik
Участник
Зарегистрирован: 21.10.2009
Сообщений: 8

Re: innoDB связянные таблицы

а как эту же базу : colors,forms,objects,spec_objects реализовать без INNODB?
Когд я искал про связность таблиц то находил примеры только с использованием INNODB

Неактивен

 

#4 29.10.2009 12:27:07

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: innoDB связянные таблицы

Просто INNODB поддерживают транзакции. От таблиц, которые не их не поддерживают, все стараются отходить. По-моему, это единственная причина, почему в примерах все используют INNODB. Если есть желание, то можно строить реляционную БД на любых поддерживаемых сервером типах таблиц. Просто INNODB удобнее.

PS: то, что вы называете связью - это просто ограничение внешнего ключа. Его отсутствие не говорит об отсутствии связи. Связь - это то что у вас в голове.

Неактивен

 

#5 15.04.2010 09:47:51

Edisson
Участник
Откуда: Yekaterinburg
Зарегистрирован: 22.10.2009
Сообщений: 15

Re: innoDB связянные таблицы

-> paulus
т.е. если не планируется вводить транзакции то смысла в использовании InnoDB особого нет?

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

2. насколько понимаю единственное - следует при конфигурировании mysql выставить число возможных подключений к серверу?

3. еще прочел тут же на форуме:

vasya написал:

Чтение блокирует запись, но не другое чтение
Запись блокирует и запись и чтение
Блокировка может быть явная или неяная:
- неявно устанавливает сервер на время выполнения одного выражения. Уровень блокировки зависит от хранилища:
    -) MyISAM, MEMORY, MERGE -- table level
    -) BDB -- page level
    -) InoDB -- row level

я правильно понял, что ежели идет запись в таблицу (при MyISAM) то таблицу не могут прочесть другие юзеры?
т.е. в таком случае лучше использовать InnoDB, чтобы блокировалась только строка а не таблицы целиком?

Отредактированно Edisson (15.04.2010 11:25:38)

Неактивен

 

#6 15.04.2010 16:58:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: innoDB связянные таблицы

Да, основная разница именно в блокировках.

Неактивен

 

#7 28.11.2010 01:38:24

Gingervm
Участник
Зарегистрирован: 28.11.2010
Сообщений: 1

Re: innoDB связянные таблицы

у меня похожая проблема, только ее решение я не очень поняла

ERROR 1005: Can't create table '.\momydb\#sql-50c_10.frm' (errno: 121)

SQL Statement:

ALTER TABLE `momydb`.`cop_machine`

  ADD CONSTRAINT `inventory_№`

  FOREIGN KEY (`inventory_№` )

  REFERENCES `momydb`.`texn` (`inventory_№` )

  ON DELETE NO ACTION

  ON UPDATE NO ACTION

, DROP PRIMARY KEY

, ADD PRIMARY KEY (`idcop_machine`)



ERROR: Error when running failback script. Details follow.



ERROR 1046: No database selected

SQL Statement:

CREATE TABLE `cop_machine` (

  `idcop_machine` int(10) unsigned NOT NULL auto_increment,

  `proizvoditel` text,

  `model` text,

  `type` text,

  `min_paper` varchar(4) default NULL,

  `max_paper` varchar(4) default NULL,

  `inventory_№` bigint(20) unsigned NOT NULL,

  PRIMARY KEY  (`idcop_machine`),

  KEY `inventory_№` (`inventory_№`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8


я в уже существующие таблицы добавляю связь, связываю таблицу cop_machine с таблице texn по полю inventory_№, причем по этому полю аналогичным образом таблица texn уже связана с таблицей proector и там никаких проблем не возникло. причем если первой связывать cop_machine, то тоже все в порядке, но тогда уже proector не хочет связываться. ощущение что почему-то нельзя связываться по одному полю с несколькими таблицами...

Неактивен

 

#8 29.11.2010 13:10:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: innoDB связянные таблицы

ERROR 1046: No database selected

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson