Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: По поводу ссылочной целостности...
 
 автор: ChpocksML   (01.08.2006 в 10:52)   письмо автору
 
 

Привет всем! Помогите пожайлуста вот с такой проблемкой:
Создаю в MySQL базу из 2-х табличек следующем образом

CREATE TABLE Users(
pk_user int NOT NULL auto_increment,
Surname char(15) NOT NULL,
Firstname char(15) NOT NULL,
Patronymic char(15) NOT NULL,
Phone char(11) NOT NULL,
Login char(20) NOT NULL,
Password char(20) NOT NULL,
Primary key (pk_user)
)TYPE=MyISAM;

CREATE TABLE Options(
pk_options int NOT NULL auto_increment,
Answerback text NULL,
Label int NULL,
pk_user int NULL,
PRIMARY KEY (pk_options)
)TYPE=MyISAM;

Потом связываю их связью один-ко-много (табличка Users - главная).

ALTER TABLE Options
add foreign key (pk_user)
references Users (pk_user)
on delete cascade
on update cascade;

И теперь, насколько я понимаю, при удалении записи из таблички
users каскадно должна удалиться запись из таблички options, естесно
при совпадении внешнего и первичного ключей. Но у меня почему то запись
из Options автоматически не удаляется. В чем дело? Помогите разобраться.
Заранее благодарю. ChpocksML.

   
 
 автор: cheops   (01.08.2006 в 12:20)   письмо автору
 
   для: ChpocksML   (01.08.2006 в 10:52)
 

Нет, таблица MyISAM не поддерживает ссылочную целостность, только таблицы InnoDB.

   
 
 автор: Loki   (01.08.2006 в 13:01)   письмо автору
 
   для: cheops   (01.08.2006 в 12:20)
 

Если я правильно понял мануал, то каскадное удаление не работает и в InnoDB тоже... Что-то там контролируется, но нормальной функциональности вроде как нет.

   
 
 автор: cheops   (01.08.2006 в 16:26)   письмо автору
 
   для: Loki   (01.08.2006 в 13:01)
 

Нет от чего же, всё работает, я пробовал - только для этого явно нужно указывать внешний ключ.

   
 
 автор: ChpocksML   (01.08.2006 в 20:20)   письмо автору
 
   для: cheops   (01.08.2006 в 16:26)
 

Спасибо за совет. То есть, как я понял, нужно создать таблицы типа InnoDB,
и все будет прекрасно работать!? Если я ошибаюсь, то можно поподробнее объяснить
как мне правильно сделать - я новичек в этой области...
У меня в связи с этим есть еще 2 небольших вопроса: во первых можно ли каким
либо образом исправить тип таблицы с MyISAM на InnoDB, не пересоздавая их?
Второй вопрос немножко не по теме, но я думаю он слишком маленький, чтобы
создавать для него новую тему... А вопрос в следующем: у меня в текстовом файле
написан SQL код, который создает мою базу данных. Могу ли я какой-нибудь командой
загрузить этот код в mySQL? Заранее благодарен всем откликнувшимся... ;)

   
 
 автор: cheops   (01.08.2006 в 22:16)   письмо автору
 
   для: ChpocksML   (01.08.2006 в 20:20)
 

>То есть, как я понял, нужно создать таблицы типа InnoDB,
>и все будет прекрасно работать!?
Да, но потребуется создать внешний ключ
FOREIGN KEY (pk_user) REFERENCES Users(pk_user)
ON DELETE CASCADE
ON UPDATE CASCADE
>каким либо образом исправить тип таблицы с MyISAM на InnoDB, не пересоздавая их?
Это можно сделать при помощи запроса
ALTER TABLE pk_user TYPE = InnoDB;

>Могу ли я какой-нибудь командой загрузить этот код в mySQL?
Если речь идёт о консольной утилите mysql, то можно поступить следующим образом
SOURCE имя_файла

   
 
 автор: ChpocksML   (02.08.2006 в 07:30)   письмо автору
 
   для: cheops   (01.08.2006 в 22:16)
 

Спасибо Cheops, ты мне очень помог. Удачи.

   
 
 автор: ChpocksML   (02.08.2006 в 07:58)   письмо автору
 
   для: ChpocksML   (02.08.2006 в 07:30)
 

Да, рановато я обрадовался... У меня почему то ни тип таблички не меняется, ни ключ внешний не создается.
В общем пишу я ему следующее:
Show table status; - и вижу, что табличка Users типа MyISAM.
Затем набираю
ALTER TABLE Users TYPE = InnoDB;
и опять Show table status; - но изменений никаких. табличка Users как была типа MyISAM так и осталась.
тоже самое и с внешним ключем: пишу я следующее:


alter table Options
    add foreign key (pk_user)
        references Users(pk_user)
            on delete cascade
            on update cascade;

(В табличке Options имеется поле pk_user, но оно не является внешним ключем)
У меня MySQL v 3.23.53

   
 
 автор: cheops   (02.08.2006 в 10:15)   письмо автору
 
   для: ChpocksML   (02.08.2006 в 07:58)
 

Хм... какая у вас версия старая, ALTER TABLE в ней точно не позволяет устанавливать внешний ключ, тип таблицы меняться должен, но не факт, что InnoDB поддерживается по умолчанию. Она тогда находилась в стадии бета-тестирования, если мне память не изменяет. Нет возможности использовать более новую версию?

   
 
 автор: ChpocksML   (02.08.2006 в 11:23)   письмо автору
 
   для: cheops   (02.08.2006 в 10:15)
 

я попробую установить более новую версию, просто я устанавливал все нужное по по хэлпу, там ссылка была на этот mysql. Возможно правда на более новой версии все будет нормально работать. Спасибо за совет.

   
 
 автор: ChpocksML   (02.08.2006 в 17:37)   письмо автору
 
   для: ChpocksML   (02.08.2006 в 11:23)
 

Спасибо большое, Cheops. Установил я MySQL 5.0 и все заработало. И тип таблиц изменил
и с целостностью разобрался. Только почему-то, при работе с этим MySQL, не могу подключиться
к серверу (скрипт пишу на php). Может быть еще и здесь кто-нибудь подкинет идею? При
установки MySQL у меня спросили только пароль админимтратора. А код для подключения следующий использую:

<?
    $dblocation 
"localhost";
    
$dbname "DB";
    
$dbuser "root";
    
$dbpasswd "password";

    
$dbcnx = @mysql_connect($dblocation$dbuser$dbpasswd);
    if (!
$dbcnx){
[
b][i]        exit("<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>");[/b][/i]
    }

    if(!@
mysql_select_db($dbname$dbcnx)){
        exit( 
"<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>");
    }

    
$query "SELECT VERSION()";
    
$ver mysql_query($query);

    if(!
$ver)
        exit(
"Ошибка при определении версии MySQL-сервера");

    
$version mysql_result($ver0);
    list(
$major$minor) = explode("."$version);

    
$ver $major.".".$minor;
    if((float)
$ver >= 4.1){
        
mysql_query("SET NAMES 'cp1251'");
    }
?>


Хотя на версии MySQL 3.23.53 все работало нормально- соединение с базой и сервером устанавливалось. А сейчас, каждый раз при запуске выдает выделенное в коде сообщение. Может тут что-нибудь добавить или убрать надо? Кстати, в этой версии у меня в трее светофорчика нет... Подскажите пожалуйста, в чем проблема...

   
 
 автор: cheops   (02.08.2006 в 17:55)   письмо автору
 
   для: ChpocksML   (02.08.2006 в 17:37)
 

А у вас в системе библиотек от MySQL 3.23.53 не осталось?

   
 
 автор: ChpocksML   (02.08.2006 в 19:58)   письмо автору
 
   для: cheops   (02.08.2006 в 17:55)
 

В установках и удалении программ сначала грохнул MySQL3.23.53, а потом вручную удалил все что осталось в установочной директории. Так что не должно было ничего остаться.

   
 
 автор: cheops   (02.08.2006 в 23:46)   письмо автору
 
   для: ChpocksML   (02.08.2006 в 19:58)
 

А в директории C:/Windows/system32 не оставлось библиотеки libmysql.dll?

   
 
 автор: ChpocksML   (03.08.2006 в 00:04)   письмо автору
 
   для: cheops   (02.08.2006 в 23:46)
 

Искал эту дллку и нашел только одну в папке с установленным MySQL5.0, а в system32 - нету, да и вообще в папке windows нет.

   
 
 автор: cheops   (03.08.2006 в 00:13)   письмо автору
 
   для: ChpocksML   (03.08.2006 в 00:04)
 

А в корневой директории PHP её разве нет?

   
 
 автор: ChpocksML   (03.08.2006 в 08:20)   письмо автору
 
   для: cheops   (03.08.2006 в 00:13)
 

Нет, нету. У меня может и php старый - версия 4.2.3?

Кстати, может что-то не работает из-за настроек MySQL?!
Я при настройке конфигурации устанавливаю тип
сервера - Server Machine, базу данных выбираю
Multifunctional DataBase,
что касается пользователей, ставлю Decision Support/OLAP,
Номер порта: 3306, Имя сервера: MySQL5, ну и пароль администратора.
Может быть в этих настройках что-то не так?

   
 
 автор: cheops   (03.08.2006 в 12:15)   письмо автору
 
   для: ChpocksML   (03.08.2006 в 08:20)
 

Хм... очень странно, должна бы быть, вы загружали zip-архив дистрибутива PHP или инсталлятор?

   
 
 автор: ChpocksML   (03.08.2006 в 12:20)   письмо автору
 
   для: cheops   (03.08.2006 в 12:15)
 

ZIP-архив. У меня есть еще один php версии 5... там эта дллка есть, но че то я не могу пока настроить апачу, а точнее файл httpd.conf. Как мне кажется, там не должно быть различий в настройке для php4 и php5, верно?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования