Задавайте вопросы, мы ответим
Вы не зашли.
Создаю базу данных:
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 построить реляционную базу?
Неактивен
Ну, во-первых, при создании внешних ключей нужно, чтобы были индексы по
соответствующим столбцам в обеих таблицах. Если Вы создаете внешний ключ
в команде, которая создает таблицу, то сам индекс неявно создается MySQL. Иначе
это нужно делать явно. Ну и с именами надо разобраться, т.е. после добавления
индексов команда ALTER TABLE `spec_objects` ADD FOREIGN KEY (`color`) ... у меня
заработала, а с явным указанием названия связи — нет. Второе, конечно, бага,
но, кажется, не очень значительная.
А во-вторых, реляционность базы данных, конечно же, не зависит от наличия
внешних ключей. Более того, база без внешних ключей работает быстрее: ничего
не делать быстрее, чем проверять связи
Неактивен
а как эту же базу : colors,forms,objects,spec_objects реализовать без INNODB?
Когд я искал про связность таблиц то находил примеры только с использованием INNODB
Неактивен
Просто INNODB поддерживают транзакции. От таблиц, которые не их не поддерживают, все стараются отходить. По-моему, это единственная причина, почему в примерах все используют INNODB. Если есть желание, то можно строить реляционную БД на любых поддерживаемых сервером типах таблиц. Просто INNODB удобнее.
PS: то, что вы называете связью - это просто ограничение внешнего ключа. Его отсутствие не говорит об отсутствии связи. Связь - это то что у вас в голове.
Неактивен
-> 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)
Неактивен
Да, основная разница именно в блокировках.
Неактивен
у меня похожая проблема, только ее решение я не очень поняла
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 не хочет связываться. ощущение что почему-то нельзя связываться по одному полю с несколькими таблицами...
Неактивен
ERROR 1046: No database selected
Нужно начать с того, что Вы выберете базу, в которую будете добавлять таблицу.
Неактивен