Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как связать несколько таблиц, реляционная база данных 
:(
    Опции темы
slang
Дата 9.8.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Каким образом связать несколько таблиц в одну. Это делается на стадии создания таблиц или можно сделать после?

Как отображать ошибки при запросах к базе. Где-то видел, но сейчас не могу найти.
Т.е. кроме того, что запрос не выполняется, нужно чтобы SQL сказал причину, почему.


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Наставник
Дата 9.8.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: нет
Всего: 15



Цитата(slang @ 9.8.2005, 10:24)
Каким образом связать несколько таблиц в одну

1. Можно сделать это с помощью самой архитектуры БД MySQL, используя внешние ключи (соответственно это вариант на СТАДИИ разработки БД)
2. Можно сделать подобную связь программно используя PHP. (соответственно это вариант после СТАДИИ разработки БД)


Цитата(slang @ 9.8.2005, 10:24)
Как отображать ошибки при запросах к базе

ну вот хотя бы так -> Модуль соединения с БД. (db_connect.php)

Код

<?php
    $dbHost="localhost";
    $dbLogin="root";
    $dbPass="";
    $dbName="bgs";

    // пытается установить постоянное соединение с MySQL сервером,
    // если не получается, то пытается установить обычное соединение,
    // если и это не выходит, то report(). если соединение было
    // установлено, то выбирает БД ($dbName)
    function ct()
    {
        global $link,$isPersistent,$dbHost,$dbLogin,$dbPass,$dbName;

        $link=@mysql_pconnect($dbHost,$dbLogin,$dbPass);
        if(!$link)
        {
            $isPersistent=true;
            $link=@mysql_connect($dbHost,$dbLogin,$dbPass);
            if(!$link)
            {
                $msg="Could not open both persistent and temporary connection to MySQL DB
                server: $dbLogin@$dbHost";
                report($msg);
            }
        }
        else
            $isPersistent=false;
        mq("USE $dbName;");
    }

    // проверяет, было ли соединение с MySQL постоянным, если нет,
    // то разрывает соединение
    function dt()
    {
        global $link,$isPersistent;
        if(!$isPersistent)
            mysql_close($link);
    }

    // сообщение, которое выдается клиенту, если произошла
    // ошибка и режим отладки отключен:
    $dbErrorMsg="An error occured.<br>\nPlease try again later.<br>\n";

    // режим отладки: если true, то все сообщения об ошибках
    // будут передаваться клиенту, если false, то клиенту выдается
    // $dbErrorMsg, а сообщение об ошибке отправляется на
    // емаил разработчику
    $debug=true;

    // error reporting
    function report($msg)
    {
        global $debug,$dbErrorMsg,$developerEmail;
        if($debug)
            echo nl2br("<b>$msg</b>");
    //    отправление ошибки на почту - отключено
    /*    else
        {
            mail($developerEmail,"MySQL error",$msg);
            echo $dbErrorMsg;
        }*/
        exit();
    }

    // mysql_query() + проверка правильности запроса и report(),
    // если запрос содержал ошибки
    function mq($query,$log=true)
    {
        global $REQUEST_URI; // Часть url после название хоста и порта
        $result=@mysql_query($query);
        $error=mysql_errno();
        if($error!=0)
        {
            $msg="MySQL query error.\nQuery was: $query\nMySQL returned: $error: ".
            mysql_error()."\n\$REQUEST_URI:\n$REQUEST_URI";
            report($msg);
        }

        if($log)
        {
            $fp=fopen("./sql.log","a");
            fwrite($fp,@$PHP_SELF.", ".date("d.m.Y H:i:s").": ".$query."\r\n");
            fclose($fp);
        }
        return $result;
    }

    function mfa($iden)    {
        if($iden)
            $result=mysql_fetch_array($iden);
        else
            report($msg);
        return $result;
    }
?>


Простой пример использования.
Код

<?php
include 'db_connect.php';
ct();
   $res=mq("SELECT * FROM table");[s]
dt();
?>


В результате, все запросы к БД записываются в файл sql.log, а возникающие ошибки подробно выводятся на экран

Это сообщение отредактировал(а) Наставник - 9.8.2005, 10:43


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
slang
Дата 9.8.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Наставник
Так существует возможность/необходимость связывания таблиц в базе между собой. С помощью каких команд это сделать. Т.е. как я понимаю это гарантирует правильное заполнение базы, если таблицы логически должны быть связаны. Так ведь?


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Наставник
Дата 9.8.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: нет
Всего: 15



Хм. slang

Ну допустим рассмотрим вариант номер 2 - связать таблицы с помощью языка программирования.
Допустим, задача сделать каскадное удаление (это когда если в главной таблице удаляется запись, то и в подчиненной соответствующая запись удаляется автоматически)

пусть table1 -> главная таблица, в котором есть поле id и другие поля, которые описывают товар
пусть table2 -> подчиненная таблица, которой хранится количество товара на складе и кому это принадлежит (какому товару это принадлежит) определяется по id из главной таблицы.
Компания меняет свой род деятельности, и не хочет использовать товар "Дрель" под id 34, соответствующая запись о количестве товара должна быть удалена из подчиненной таблицы.. вот как это можно реализовать

Код

mysql_query("DELETE table1  WHERE id=34");
mysql_query("DELETE table2  WHERE id=34");


Вот и все, реализовали каскадное удаление с помощью очень простого механизма.



--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
slang
Дата 9.8.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Однако, если не связать эти таблицы, то в случае ошибок я могу записать во вторую таблицу количество товара, которого не существует. Конечно, это все можно сделать и при создании форм для введения товара, однако, если этот механизм будет контролировать еще и БД, а она это может, просто я не знаю как это сделать, то это повысит надежность проекта.
Т.е. саму суть реляционной базы данных я понимаю. Мне-бы средство, которое поможет сразу обрубить все возможные ошибки в базе.

Это сообщение отредактировал(а) slang - 9.8.2005, 11:09


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Наставник
Дата 9.8.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: нет
Всего: 15



Ну хорошо, вот Вам пример, который контролирует правильность выполнения запросов с помощью транзакций.

Код

mysql_query("BEGIN");
mysql_query("DELETE table1  WHERE id=34");
mysql_query("DELETE table2  WHERE id=34");
mysql_query("ROLLBACK");
здесь ситуация, такая эти два запроса как бы объединяются в один, и если в одном из запросов происходит ошибка (пусть даже и во втором), то ни один из двух запросов не будет выполнен.

Теперь на сколько я понял, вы хотите с помощью первого варианта (на основе внешних ключей) разработать структуру БД..

Первое вам надо изменить дескриптор таблицы на InnoDB, т.к. только этот тип таблиц поддерживает в MySQL ключи.

А вот вам пример...

Код

CREATE TABLE table1 
{
  id INT NOT NULL.
  PRIMARY KEY (id)
} TYPE=INNODB;

CREATE TABLE table2
{
  id INT NOT NULL,
  add_id INT NOT NULL,
  PRIMARY KEY (id,add_id) // составной ключ, но это сейчас не важно
  FOREIGN KEY (id) REFERENCES table1 (id) ON DELETE CASCADE
} TYPE=INNODB;


внешний ключ объявляем как ON DELETE CASCADE - это говорит о том, что удаление какой-либо записи из таблицы table1 будет означать автоматическое удаление записей с соответсвующими значениями столбца id из таблицы table2

А вообще рекомендую почитать мануал... там все подробно описано

Удачи.





--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
slang
Дата 9.8.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: 1
Всего: 0



Огромное спасибо!!!!!!!


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Наставник
Дата 9.8.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004

Репутация: нет
Всего: 15



Да без проблем :--)))... спрашивай, если что... Всего доброго.


--------------------
Богатство языка определяет широту мысли
Персональный сайт >>
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0665 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.