Ключевые слова:perl, sql, example, cgi, mysql, (найти похожие документы)
Date: Thu, 19 Oct 2000 18:21:29 +0400 (MSD)
From: MailList: Perl в примерах
Subject: SQL - Работа с таблицами (CREATE)
-----------------------------------------------------------
PERL В ПРИМЕРАХ
N 11 (19.10.2000)
Эту и другие статьи читайте на http://properl.com
-----------------------------------------------------------
Мы начинаем публиковать статьи, присланные вами.
Подробности - http://properl.com/cgi-bin/go.pl?author
-----------------------------------------------------------
В форуме "Perl в примерах"
(http://properl.com/cgi-bin/forum/config.pl)
Вы можете получить ответы на интересующие Вас вопросы по
теме Perl, CGI и баз данных.
-----------------------------------------------------------
Работа с таблицами
Допустим у вас есть виртуальный сервер. Провайдер создал
для вас базу данных на этом сервере. Что с ней делать
дальше?
Из этой статьи вы узнаете как создавать, удалять, изменять
структуру таблиц и наполнять их данными.
Создание таблицы
Команда CREATE TABLE (см. также Примеры запросов в MySQL)
позволяет создать таблицу.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]
[название_базы.]название_таблицы [(определение_поля,...)]
[свойства_таблицы] [выражение_select]
Временная таблица (TEMPORARY) будет автоматически удалена
после закрытия соединения с базой данных. Два различных
соединения могут создавать таблицы с одинаковым именем не
конфликтуя при этом. Если уже существует таблица с таким
именем, то она будет спрятана пока не будет удалена
временная таблица.
Вы можете использовать IF NOT EXISTS чтобы не получать
ошибку когда таблица с таким именем уже существует.
определение_поля:
название_поля тип [NOT NULL] [DEFAULT значение_по_умолчанию]
[AUTO_INCREMENT] [PRIMARY KEY]
или PRIMARY KEY (индексированное_поле,...)
или KEY [название_индекса] (индексированное_поле,...)
или INDEX [название_индекса] (индексированное_поле,...)
или UNIQUE [INDEX] [название_индекса] (индексированное_поле,...)
или FULLTEXT [INDEX] [название_индекса] (индексированное_поле,...)
индексированное_поле:
название_поля [(длина)]
Описание типов MySQL см. здесь.
Поле типа INTEGER может иметь атрибут AUTO_INCREMENT.
Когда вы присваиваете такому полю значение
NULL (рекомендуется) или 0, то оно принимает максимальное
значение этого поля в таблице + 1. Минимальное значение
такого поля 1.
В таблице может быть только одно поле AUTO_INCREMENT, и
оно должно быть индексированным.
Последнюю строчку, добавленную в таблицу c полем
AUTO_INCREMENT можно найти при помощи такого запроса:
SELECT * FROM название_таблицы WHERE поле_auto_incr IS NULL;
Если не определено значение поля по умолчанию (DEFAULT)
то ему присваивается значение по умолчанию NULL, если поле
может принимать значение NULL. Если поле определено как
NOT NULL, то значение по умолчанию зависит от типа поля:
0 для числовых полей (кроме полей AUTO_INCREMENT);
следующее значение в последовательности для полей AUTO_INCREMENT;
текущая дата и время для первого поля TIMESTAMP в таблице;
пустая строка для строковых полей.
KEY и INDEX являются синонимами.
Поле с UNIQUE (уникальным) индексом не может иметь двух
одинаковых значений в пределах таблицы.
PRIMARY KEY - это уникальный индекс, который требует чтобы
поле было определено как NOT NULL. В таблице может быть
только один PRIMARY KEY.
PRIMARY KEY может индексировать несколько полей. Для этого
надо использовать синтаксис
PRIMARY KEY(индексированное_поле, ...).
Индексы FULLTEXT используются для поиска в текстовых
полях. Они используются для VARCHAR и TEXT полей.
Подробнее о свойствах таблицы см. здесь.
свойства_таблицы:
TYPE = {ISAM | MYISAM | HEAP | MERGE}
MYISAM - тип таблицы по умолчанию
HEAP - эти таблицы создаются в памяти, что делает их очень
быстрыми. Такие таблицы можно использовать как временные.
Подробнее о типах таблиц см. здесь.
выражение_select:
[IGNORE | REPLACE] SELECT ...
(см. Запросы выборки данных из таблиц)
Для создания таблицы можно использовать выражение SELECT.
В этом случае будут созданы поля для всех элементов SELECT.
Например:
mysql> CREATE TABLE test (a int not null auto_increment,
primary key (a), key(b))
TYPE=HEAP SELECT b,c from test2;
Будет создана таблица с тремя полями.
Добавление записей в таблицы производится командой INSERT,
которая была рассмотрена в предыдущей статье.
Приведенный ниже скрипт создает таблицы и добавляет в них
записи. Его можно выполнять из командной строки
$ initdb.pl
или через броузер
http://your.servrer.com/cgi-bin/initdb.pl
Перед выполнением скрипта не забудьте присвоить ему права
доступа командой
$ chmod 755 initdb.pl
#!/usr/bin/perl
use DBI;
$database = 'your_database_name'; # Название базы данных
$user = 'your_user_name'; # Имя пользователя MySQL
$password = 'your_password'; # Пароль MySQL
print "Content-Type: text/html\n\n";
print "";
# Подключаемся к базе
$dbh = DBI->connect("DBI:mysql:${database}", $user, $password)
or die "Wrong password\n";
# Создаем таблицы
$dbh->do("CREATE TABLE users (UID MEDIUMINT UNSIGNED,
ALLOWED TINYINT UNSIGNED DEFAULT 1,
CREDIT DECIMAL(15,3) DEFAULT 0);") or &err_msg;
$dbh->do("CREATE TABLE userinfo (UID MEDIUMINT UNSIGNED,
PASSWORD CHAR(16), LASTNAME CHAR(20) DEFAULT '',
FIRSTNAME CHAR(20) DEFAULT '',
EMAIL CHAR(40) DEFAULT '');") or &err_msg;
# Добавляем записи в таблицы
$dbh->do("INSERT INTO users (UID, CREDIT)
VALUES (0, 1000);") or &err_msg;
$dbh->do("INSERT INTO userinfo (UID, PASSWORD)
VALUES (0, PASSWORD('abcdef'));") or &err_msg;
$dbh->disconnect;
print "Database was initialized succesfully.";
print "";
sub err_msg {
$dbh->disconnect;
die "Can't execute $statement: $dbh->errstr";
}
-----------------------------------------------------------
(c) ProPerl.com 2000