Как заполнить таблицу sql server. Важные моменты про инструкцию SELECT INTO

Прежде чем приступать к созданию таблицы SQL, необходимо определить модель базы данных. Спроектировать ER-диаграмму, в которой определить сущности, атрибуты и связи.

Основные понятия

Сущности - предметы или факты, информацию о которых необходимо хранить. Например, сотрудник фирмы или проекты, реализуемые предприятием. Атрибуты - составляющая, которая описывает или квалифицирует сущность. Например, атрибут сущности «работник» - заработная плата, а атрибут сущности «проект» - сметная стоимость. Связи - ассоциации между двумя элементами. Она может быть двунаправленная. Также существует рекурсивная связь, то есть связь сущности с самой собой.

Также необходимо определить ключи и условия, при которых сохранится целостность базы данных. Что это значит? Другими словами - ограничения, которые помогут сохранить базы данных в правильном и согласованном виде.

Переход от ER-диаграммы к табличной модели

Правила перехода к табличной модели:

  1. Преобразовать все сущности в таблицы.
  2. Преобразовать все атрибуты в столбцы, то есть каждый атрибут сущности должен быть отображен в имени столбца таблицы.
  3. Уникальные идентификаторы преобразовать в первичные ключи.
  4. Все связи преобразовать во внешние ключи.
  5. Осуществить создание таблицы SQL.

Создание базы

Сначала неоходимо запустить сервер MySQL. Для его запуска следует зайти в меню "Пуск", затем в "Программы", далее в MySQL и MySQL Server, выбрать MySQL-Command-Line-Client.

Для создания базы данных применяется команда Create Database. Данная функция имеет следующий формат:

CREATE DATABASE название_базы_данных.

Ограничения на название базы следующие:

  • длина составляет до 64 знаков и может включать буквы, цифры, символы «» и "";
  • имя может начинаться с цифры, но в нем должны присутствовать буквы.

Нужно помнить и общее правило: любой запрос или команда заканчиваются разделителем (delimiter). В SQL принято в качестве разделителя использовать точку с запятой.

Серверу необходимо указать, с какой базой данных нужно будет работать. Для этого существует оператор USE. Этот оператор имеет простой синтаксис: USE название_базы_данных.

Создание таблицы SQL

Итак, модель спроектирована, база данных создана, и серверу указано, как именно с ней нужно работать. Теперь можно начинать создавать таблицы SQL. Существует язык определения данных (DDL). Он используется для создания таблицы MS SQL, а также для определения объектов и работы с их структурой. DDL включает в себя набор команд.

SQL Server создания таблицы

Используя всего лишь одну команду DDL, можно создавать различные объекты базы, варьируя ее параметры. Для применяется команда Create Table. Формат tt выглядит следующим образом:

CREATE TADLE название_таблицы, (название_столбца1 название _столбца2 тип данных [ограничение_столбца],[ограничения_таблицы]).

Следует подробнее описать синтаксис указанной команды:

  • Название таблицы должно иметь длину до 30 символов и начинаться с буквы. Допустимы только символы алфавита, буквы, а также символы «_», «$» и «#». Разрешено использование кириллицы. Важно отметить, что имена таблиц не должны совпадать с именами других объектов и с зарезервированными словами сервера базы данных, таких как Column, Table, Index и т. д.
  • Для каждого столбца следует обязательно указать тип данных. Существует стандартный набор, используемый большинством. Например, Char, Varchar, Number, Date, тип Null и т. д.

  • С помощью параметра Default можно задать значение по умолчанию. Это гарантирует, что в таблице не будет неопределенных значений. Как это понимать? Значением по умолчанию может быть символ, выражение, функция. Важно помнить, что тип этих данных, заданных по умолчанию, должен совпадать с типом вводимых данных столбца.
  • Ограничения на каждый столбец используют для реализации обеспечения условий целостности для данных на уровне таблицы. Есть и еще нюансы. Запрещено удалять таблицу, если есть зависимые от нее другие таблицы.

Как работать с базой

Для реализации крупных проектов чаще всего требуется создание нескольких баз данных, и каждая требует множество таблиц. Конечно, удержать всю информацию в голове пользователям невозможно. Для этого предусмотрена возможность посмотреть структуру баз данных и таблиц в них. Существует несколько команд, а именно:

  • SHOW DATABASES - показывает на экране все созданные базы данных SQL;
  • SHOW TABLES - выводит список всех таблиц для текущей базы данных, которые выбираются командой USE;
  • DESCRIBE название_таблицы - показывает описание всех столбцов таблицы.
  • ALTER TABLE - позволяет изменять структуру таблицы.

Последняя команда позволяет:

  • добавить в таблицу столбец или ограничение;
  • изменить существующий столбец;
  • удалить столбец или столбцы;
  • удалить ограничения целостности.

Синтаксис этой команды выглядит так: ALTER TABLE название_таблицы { | | | | [{ENABLE | DISABLE} CONSTANT имя_ограничения ] | }.

Существуют и другие команды:

  • RENAME - переименование таблицы.
  • TRUNCATE TABLE -удаляет все строки из таблицы. Эта функция может быть нужна, когда необходимо заполнить таблицу заново, а хранить предыдущие данные нет необходимости.

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

Синтаксис команды довольно простой: DROP TABLE название _таблицы.

В SQL Access создание таблиц и их изменение осуществляется теми же командами, перечисленными выше.

С помощью CREATE TABLE можно создать пустую таблицу и в дальнейшем заполнить ее данными. Но это еще не все. Также можно сразу создавать таблицу из другой таблицы. Как это? То есть существует возможность определить таблицу и заполнить ее данными другой таблицы. Для этого существует специальное ключевое слово AS.

Синтаксис очень простой:

  • CREATE TABLE название _таблицы [(определение_столбцов )] AS подзапрос;
  • определение_столбцов - имена столбцов, правила целостности для столбцов вновь создаваемой таблицы и значения по умолчанию;
  • подзапрос - возвращает такие строки, которые нужно добавить в новую таблицу.

Таким образом, такая команда создает таблицу с определенными столбцами, вставляет в нее строки, которые возвращаются в запросе.

Временные таблицы

Временные таблицы - это таблицы, данные в которых стираются в конце каждого сеанса или раньше. Они используются для записи промежуточных значений или результатов. Их можно применять в качестве рабочих таблиц. Определять временные можно в любом сеансе, а пользоваться их данными можно только в текущем сеансе. Создание временных таблиц SQL происходит аналогично обычным, с использованием команды CREATE TABLE. Для того чтобы показать системе, что таблица временная, нужно использовать параметр GLOBAL TEMPORARY.

Предложение ON COMMIT устанавливает время жизни данных в такой таблице и может выполнять следующие действия:

  • DELETE ROWS -очистить временную таблицу (удалить все данные сеанса) после каждого завершения транзакции. Обычно это значение используется по умолчанию.
  • PRESERVE ROWS -оставить данные для использования их в следующей транзакции. Помимо этого, можно очистить таблицу только после завершения сеанса. Но есть особенности. Если произошел откат транзакции (ROLLBACK), таблица будет возвращена к состоянию на конец предыдущей транзакции.

Синтаксис создания временной таблицы может быть представлен таким образом: CREATE TABLE название _таблицы, (название _столбца1 тип данных [ограничение_столбца], название _столбца2 тип данных [ограничение_столбца], [ограничения_таблицы]).

Работа с базами данных непосредственно связана с изменением таблиц и содержащихся в них данных. Но перед началом проведения действий таблицы необходимо создать. Для автоматизации этого процесса существует специальная - "CREATE TABLE".

Первым делом!

Перед тем как разбираться с процессом создания таблиц с помощью команды MS SQL "CREATE TABLE", стоит остановиться на том, что надо знать перед началом использования функции.

Прежде всего, необходимо придумать имя таблице - оно должно быть уникальным, в сравнении с другими, находящимися в базе данных, и следовать нескольким правилам. Имя должно начинаться с буквы (a-z), после чего могут следовать любые буквы, цифры и знак подчеркивания, при этом полученная фраза не должна быть зарезервированным словом. Длина названия таблицы не должна превышать 18 символов.

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

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

Синтаксис

Разработав структуру таблицы, можно переходить к её созданию. Сделать это достаточно просто, воспользовавшись функцией SQL "CREATE TABLE". В ней пользователю требуется указать придуманные ранее имя таблицы и список столбцов, указав для каждого из них тип и имя. Синтаксис функции выглядит следующим образом:

CREATE TABLE table_name
({column_name datatype …| table_constraint}
[,{column_name datatype …| table_constraint}]…)

Аргументы, используемые в конструкции функции, означают следующее:

  • table_name - имя таблицы
  • column_name - имя столбца
  • datatype - тип данных, используемый в данном поле
  • DEFAULT - выражение, используемое в столбце по умолчанию.

Также возможно использование ещё двух аргументов функции:

  • colum_constraint - параметры столбца
  • table_constraint - параметры таблицы

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

Особенности создания таблиц

При написании запроса с функцией иногда необходимо установить правила заполнения полей. Для этого необходимо добавить специальные атрибуты функции, определяющие тот или иной набор условий.

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

При создании таблицы в большинстве случаев требуется унифицировать каждую запись, чтобы избежать наличия двух одинаковых. Для этого чаще всего используют нумерацию строк. И, чтобы не требовать от пользователя знания последнего номера, имеющегося в таблице, в функции "CREATE TABLE" достаточно указать столбец первичного ключа, написав ключевое слово "Primary key" после соответствующего поля. Чаще всего именно по первичному ключу и происходит соединение таблиц между собой.

Для обеспечения сцепки с Primary key используется свойство внешнего ключа "FOREIGN KEY". Указав для столбца данное свойство, можно обеспечить, что в данном поле будет содержаться значение, совпадающее с одним из тех, что находятся в столбце первичного ключа этой же или другой таблицы. Таким образом можно обеспечить соответствие данных.

Чтобы обеспечить проверку на соответствие некоторому заданному набору или определению, следует воспользоваться атрибутом CHECK. Он прописывается последним в списке аргументов функции и в качестве личного параметра имеет некоторое логическое выражение. С его помощью можно ограничить список возможных значений, например, использование в поле таблицы "Пол" только буквы "М" и "Ж".

Помимо представленных, функция имеет ещё множество специфических атрибутов, однако они используются на практике гораздо реже.

Примеры

Чтобы полноценно понять принцип работы функции, стоит рассмотреть на практике, как работает CREATE TABLE (SQL). Пример, приведенный ниже, создает таблицу, представленную на рисунке:

CREATE TABLE Custom
(ID CHAR(10) NOT NULL Primary key,
Custom_name CHAR(20),
Custom_address CHAR(30),
Custom_city CHAR(20),
Custom_Country CHAR(20),
ArcDate CHAR(20))

Как можно заметить, параметр возможного отсутствия значения в ячейке (NULL) можно опускать, так как он используется по умолчанию.

  • Как объединить инструкции SELECT, чтобы я мог рассчитать проценты, успехи и неудачи в SQL Server?
  • SQL: как выбрать только отдельные строки на основе некоторых значений свойств
  • Как выбрать продукт с максимальной ценой каждой категории?
LevelId Min Product 1 x 1 2 y 1 3 z 1 4 a 1

Мне нужно дублировать те же данные в базе данных, изменив только идентификатор продукта от 1 2,3 …. 40

LevelId Min Product 1 x 2 2 y 2 3 z 2 4 a 2

Я мог бы сделать что-то вроде

INSERT INTO dbo.Levels SELECT top 4 * fROM dbo.Levels но это просто скопирует данные. Есть ли способ, которым я могу скопировать данные и вставить его, изменяя только значение Product?

Вы больше всего на пути – вам нужно сделать еще один логический шаг:

INSERT INTO dbo.Levels (LevelID, Min, Product) SELECT LevelID, Min, 2 FROM dbo.Levels WHERE Product = 1

… будет дублировать ваши строки с другим идентификатором продукта.

Также учтите, что WHERE Product = 1 будет более надежным, чем TOP 4 . Как только у вас будет больше четырех строк в таблице, вы не сможете гарантировать, что TOP 4 вернет те же четыре строки, если вы также не добавите ORDER BY для выбора, однако WHERE Product = ... всегда будет возвращать тот же и будет продолжать работать, даже если вы добавите дополнительную строку с идентификатором продукта 1 (где вам нужно будет рассмотреть возможность изменения TOP 4 в TOP 5 и т. д., если добавить дополнительные строки).

Вы можете сгенерировать идентификатор продукта, а затем загрузить его в:

< 40) INSERT INTO dbo.Levels(`min`, product) SELECT `min`, cte.n as product fROM dbo.Levels l cross join cte where l.productId = 1;

Это предполагает, что LevelId является столбцом идентификатора, который автоматически увеличивается при вставке. Если не:

With cte as (select 2 as n union all select n + 1 from cte where n < 40) INSERT INTO dbo.Levels(levelid, `min`, product) SELECT l.levelid+(cte.n-1)*4, `min`, cte.n as product fROM dbo.Levels l cross join cte where l.productId = 1;

INSERT INTO dbo.Levels (LevelId, Min, Product) SELECT TOP 4 LevelId, Min, 2 FROM dbo.Levels

Вы можете включать выражения в SELECT , либо жестко заданные значения, либо что-то вроде Product + 1 или что-то еще.

Я ожидаю, что вы, вероятно, не захотите вставлять LevelId, но оставите это там, чтобы соответствовать вашему образцу. Если вы не хотите, чтобы это просто удалялось из разделов INSERT и SELECT .

Например, вы можете использовать CROSS JOIN для таблицы чисел.

WITH L0 AS(SELECT 1 AS C UNION ALL SELECT 1 AS O), -- 2 rows L1 AS(SELECT 1 AS C FROM L0 AS A CROSS JOIN L0 AS B), -- 4 rows Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N FROM L1) SELECT lvl., lvl., num.[N] FROM dbo. lvl CROSS JOIN Nums num

Это будет повторяться 4 раза.

Вопрос: заполнение таблиц запросами sql


наверное заезженная тема, но все таки...заполнение таблиц при помощи запросов..возникли проблемы... помогите разобрать что не так.нужно создать БД "Водопостачання"
при помощи запросов, прикрепленных в файле - создала таблицы..
начала их заполнять, опять-таки при помощи запросов и начали лезть ошибки...
1-я ошибка:
пишу запрос на заполнение бщих данных для таблицы тКвартири из таблицы тБудинки:

INSERT INTO тКвартири([№квартири], [код_будинку]) SELECT * FROM тБудинки
выбивает ошибку "Инструкция INSERT INTO содержит неизвестное имя поля №будинку.Проверьте что имя задано без ошибок, и повторите операцию"
я чего-то в запросе не дописала? как исправить эту ошибку???

2-я ошибка
таблицу тТарифи заполняла ручками.. теперь нужно чтоб общие данные по последнему тарифу в этой таблице переходили в таблицу тОплата_план..
Запрос на последний тариф с помощью функции max выглядит так:
SELECT Дата_встановлення, Тарифік1людини, код_тарифу FROM тТарифи WHERE Дата_встановлення = (SELECT MAX (Дата_встановлення) FROM (тТарифи));
как отдельный запрос он работает, но как я понимаю - что из этого запроса значение для код_тарифу должно копироваться в таблицу тОплата_план, т.е. я создаю следующий запрос:

INSERT INTO тОплата_план(код_тарифу) SELECT код_тарифу FROM тТарифи WHERE (SELECT код_тарифу FROM тТарифи WHERE Дата_встановлення = (SELECT MAX (Дата_встановлення) FROM (тТарифи));)

но и тут ошибка (не разобралась как кидать сюда картинки, но надеюсь и так будет понятно):

что я делаю не так??? подскажите пожалуйста... а то самой как чайнику тяжковато разбирать свои ошибки

К сообщению приложен файл (в.txt - 2Kb)

Ответ: lisica198808,

В первом запросе у вас скорее всего структура (количество и типы столбцов) тКвартири и тБудинки не совпадают. Вместо звездочки перечислите в SELECT"е в явном виде названия тех столбцов из таблицы тБудинки, которые хотите использовать в тКвартири.

Во втором запросе у вас, скорее всего, в тОплата_план несколько столбцов, для некоторых из которых запрещено использование значения NULL. Вы добавляете значение только в один столбец (код_тарифу), в остальные при том запросе, какой у вас, подставляются либо значения по умолчанию (если они определены), либо NULL. Отсюда и ошибка.

К советам sdku обязательно прислушайтесь.

Вопрос: Проблемы со счетчиком при заполнении таблицы


Доброго времени суток
Делаю процедуру на заполнение таблицы в которой есть поле счетчик
Выдает ошибку хотя я и добавил SET IDENTITY_INSERT dbo.Клиенты ON
T-SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 alter proc [ dbo] .[ Добавить_Клиента] @fiok varchar (50 ) , @telk varchar (50 ) , @skidk char (3 ) as declare @kklient int set @kklient = (select max (код_Клиента) from dbo.Клиенты) + 1 SET IDENTITY_INSERT dbo.Клиенты ON insert dbo.Клиенты values (@kklient, @fiok, @telk, @skidk) SET IDENTITY_INSERT dbo.Клиенты OFF select "Добавлен клиент:" + @fiok + " Тел:" + @telk + " Скидка:" + @skidk

Ошибка - Значение столбца идентификаторов в таблице "dbo.Клиенты" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.

Ответ:

Сообщение от _JoNi_

Попробовал так, теперь при выполнении выдает это
Извиняюсь за глупые вопросы, только начал изучать sql)

Вы можете после имени таблицы, в которую вставляете, написать в скобках имена полей через запятую?!

Вопрос: Заполнение таблицы Word с закладкой данными из запроса Access - ищу решение


Здравствуйте, люди добрые!

Где-то на просторах интернета нашел работающий пример заполнения таблицы Word данными из Access с помощью закладок. Он работает (Пример.zip).
Я, увы, в Access самоучка и много не знаю...
Как я ни пытался в своей базе данных (WORD.zip) реализовать решение из работающего примера, у меня ни чего не получается.
Вставляю элементы из примера в виде функций, как это в нём реализовано, и обращаюсь к ним - ругается по всякому.
Вставляю части этих функций в свой код - опять ругается!

То, что надо вставлять не в таблицу, оно чудесно подставляется на место закладок (работает если вынуть из кода всё то, что относится к заполнению таблицы).

Сил моих больше нет

Пожалуйста, люди добрые, исправьте мой код, что бы всё работало!
А если ещё и доходчиво объясните почему у меня не получалось, буду почитать Вас за наимудрейшего и наиотзывчивого
Access2010

Заранее благодарю!!!

P.S. В моей базе есть таблицы с Московскими улицами, Фамилиями, Именами, Отчествами, Единицами измерения (официальные сокращения) - пользуйтесь, кому надо

Ответ: затем будет останов через 2 строки(на строке insert)
--
Я не смогла вчера заставить работать этот второй вариант(corbis . пункт 2)
первый же(исходный) за час уломала(около 10 ошибок)

Вопрос: Ошибка при заполнении таблицы данными


Создана БД NewCompany, в ней создана таблица EmployeeSchema.Employee, проблема в том, что при программном заполнении таблицы возникают ошибки, учитывая,что последний столбец необходимо надо оставить пустым.
Не знаю, как исправить. Помогите пожалуйста.

Создание таблицы
USE NewCompany_Ezh;
GO

CREATE TABLE EmployeeSchema.Employee
EmpID int NOT NULL,
LName varchar(20) NOT NULL,
FName varchar(20) NOT NULL,
Title varchar(20) NULL,
BirthDate date NULL,
EmpDate date NULL,
Salary decimal(18, 2) NOT NULL,
DepID int NOT NULL,
OrgNode hierarchyid NULL,
GO

Заполнение
USE NewCompany_Ezh;
GO
DECLARE @child hierarchyid,
@manager hierarchyid = hierarchyid::GetRoot()

Корневой уровень - Директор

(1, N"Иванов", N"Иван", N"Директор", "1975-05-07", "2009-05-06", 30000.00, @manager)

Следующий уровень - Заместители

INSERT INTO EmployeeSchema.Employee VALUES
(2, N"Петров", N"Петр", N"Замдиректора", "1969-10-07", "2005-07-07", 25000.00, @child)

INSERT INTO EmployeeSchema.Employee VALUES
(3, N"Сидоров", N"Сидор", N"Замдиректора", "1981-05-05", "2009-09-09", 25000.00, @child)

SELECT @child = @manager.GetDescendant(@child, NULL)

INSERT INTO EmployeeSchema.Employee VALUES
(4, N"Еремин", N"Ерема", N"Замдиректора", "1986-11-01", "2009-10-10", 25000.00, @child)

Следующий уровень иерархии
SELECT @manager = OrgNode
FROM EmployeeSchema.Employee WHERE EmpID = 4
SELECT @child = @manager.GetDescendant(NULL, NULL)

INSERT INTO EmployeeSchema.Employee VALUES
(5, N"Александров", N"Александр", N"Помощник", "1979-01-01", "2008-01-01", 20000.00, @child)

SELECT @child = @manager.GetDescendant(@child, NULL)
INSERT INTO EmployeeSchema.Employee VALUES
(6, N"Андреев", N"Андрей", N"Помощник", "1985-04-12", "2008-01-01", 20000.00, @child)
GO

Ответ:

Сообщение от Margaret98

Создана БД NewCompany

Речь точно про MySQL, а не про MS SQL

Вопрос: Ошибка #1062 при заполнении таблицы


добрый день.
Помогите пожалуйсто решить проблемку при заполнении таблицы выдает такую ошибку:
,
Primary key - указан.
Странно если при заполнении начинаешь id_zanyt(pk) не с 1 а с 2 то ошибки не выдает...

Ответ: Все решилось!)) надо удалить тему!

Вопрос: Заполнение таблицы в БД из поля(TextBox) в форме


Приветствую, копался в интернете на тему заполнения таблицы из TextBox в форме и наткнулся на статью

и не совсем понял зачем нужно прописывать это? если форма и таблица, находятся в одной БД, то эта часть кода будет выглядеть по-другому?
Dim z As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:1Приложение Microsoft Office Access.mdb" ) "Устанавливаем соединение с базой данных. z.Open() "Открываем соединение.
и второе

Dim t As New OleDb.OleDbCommand("UPDATE [Таблица1] SET [Поле1] = " " & " " & TextBox1.Text & " " WHERE [Код] = 1" , z)
зачем мне нужно переменная z?

Вопрос: Заполнение таблиц автоматом


здравствуйте
подскажите пожалуйста
у меня есть таблица в sql. 3 столбика (поля) первое идёт автоматическое заполнение
я хочу с помощью запроса заполнить 2 и 3 поле
чтобы 2 поле было от 0 до 99 с шагом 3
3 поле 3 до 102 с шагом 3
тоесть получить сразу большую заполненую таблицу
как сделать запрос не пойму
пробовал
use имя базы;
insert into Runnums (поле2, поле3)
values (0,3)
но это только заполняет одну строчку
заранее благодарен

SQL - Урок 3. Создание таблиц и наполнение их информацией

Итак, мы познакомились с типами данных, теперь будем усовершенствовать таблицы для нашего форума. Сначала разберем их. И начнем с таблицы users (пользователи). В ней у нас 4 столбца:

Id_user - целочисленные значения, значит будет тип int, ограничим его 10 символами - int (10).
name - строковое значение varchar, ограничим его 20 символами - varchar(20).
email - строковое значение varchar, ограничим его 50 символами - varchar(50).
password - строковое значение varchar, ограничим его 15 символами - varchar(15).

Все значения полей обязательны для заполнения, значит надо добавить тип NOT NULL.

Id_user int (10) NOT NULL
name varchar(20) NOT NULL
email varchar(50) NOT NULL

Первый столбец, как вы помните из концептуальной модели нашей БД, является первичным ключом (т.е. его значения уникальны, и они однозначно идентифицируют запись). Следить за уникальностью самостоятельно можно, но не рационально. Для этого в SQL есть специальный атрибут - AUTO_INCREMENT , который при обращении к таблице на добавление данных высчитывает максимальное значение этого столбца, полученное значение увеличивает на 1 и заносит его в столбец. Таким образом, в этом столбце автоматически генерируется уникальный номер, а следовательно тип NOT NULL излишен. Итак, присвоим атрибут столбцу с первичным ключом:


name varchar(20) NOT NULL
email varchar(50) NOT NULL
password varchar(15) NOT NULL

Теперь надо указать, что поле id_user является первичным ключом. Для этого в SQL используется ключевое слово PRIMARY KEY () , в скобочках указывается имя ключевого поля. Внесем изменения:

Id_user int (10) AUTO_INCREMENT
name varchar(20) NOT NULL
email varchar(50) NOT NULL
password varchar(15) NOT NULL
PRIMARY KEY (id_user)

Итак, таблица готова, и ее окончательный вариант выглядит так:

Create table users (
id_user int (10) AUTO_INCREMENT,
name varchar(20) NOT NULL,
email varchar(50) NOT NULL,
password varchar(15) NOT NULL,
PRIMARY KEY (id_user)
);

Теперь разберемся со второй таблицей - topics (темы). Рассуждая аналогично, имеем следующие поля:



id_author int (10) NOT NULL
PRIMARY KEY (id_topic)

Но в модели нашей БД поле id_author является внешним ключом, т.е. оно может иметь только те значения, которые есть в поле id_user таблицы users. Для того, чтобы указать это в SQL есть ключевое слово FOREIGN KEY () , которое имеет следующий синтаксис:

FOREIGN KEY (имя_столбца_которое_является_внешним_ключом) REFERENCES имя_таблицы_родителя (имя_столбца_родителя);

Укажем, что id_author - внешний ключ:

Id_topic int (10) AUTO_INCREMENT
topic_name varchar(100) NOT NULL
id_author int (10) NOT NULL
PRIMARY KEY (id_topic)
FOREIGN KEY (id_author) REFERENCES users (id_user)

Таблица готова, и ее окончательный вариант выглядит так:

Create table topics (
id_topic int (10) AUTO_INCREMENT,
topic_name varchar(100) NOT NULL,

PRIMARY KEY (id_topic),
FOREIGN KEY (id_author) REFERENCES users (id_user)
);

Осталась последняя таблица - posts (сообщения). Здесь все аналогично, только два внешних ключа:

Create table posts (
id_post int (10) AUTO_INCREMENT,
message text NOT NULL,
id_author int (10) NOT NULL,
id_topic int (10) NOT NULL,
PRIMARY KEY (id_post),
FOREIGN KEY (id_author) REFERENCES users (id_user),
FOREIGN KEY (id_topic) REFERENCES topics (id_topic)
);

Обратите внимание, внешних ключей у таблицы может быть несколько, а первичный ключ в MySQL может быть только один. В первом уроке мы удалили нашу БД forum, пришло время создать ее вновь.

Запускаем сервер MySQL (Пуск - Программы - MySQL - MySQL Server 5.1 - MySQL Command Line Client), вводим пароль, создаем БД forum (create database forum;), выбираем ее для использования (use forum;) и создаем три наших таблицы:

Обратите внимание, одну команду можно писать в несколько строк, используя клавишу Enter (MySQL автоматически подставляет символ новой строки ->), и только после разделителя (точки с запятой) нажатие клавиши Enter приводит к выполнению запроса.

Помните, если вы сделали что-то не так, всегда можно удалить таблицу или всю БД с помощью оператора DROP. Исправлять что-то в командной строке крайне неудобно, поэтому иногда (особенно на начальном этапе) проще писать запросы в каком-нибудь редакторе, например в Блокноте, а затем копировать и вставлять их в черное окошко.

Итак, таблицы созданы, чтобы убедиться в этом вспомним о команде show tables :

И, наконец, посмотрим структуру нашей последней таблицы posts:

Теперь становятся понятны значения всех полей структуры, кроме поля DEFAULT. Это поле значений по умолчанию. Мы могли бы для какого-нибудь столбца (или для всех) указать значение по умолчанию. Например, если бы у нас было поле с названием "Женаты\Замужем" и типом ENUM ("да", "нет"), то было бы разумно сделать одно из значений значением по умолчанию. Синтаксис был бы следующий:

Married enum ("да", "нет") NOT NULL default("да")

Т.е. это ключевое слово пишется через пробел после указания типа данных, а в скобках указывается значение по умолчанию.

Но вернемся к нашим таблицам. Теперь нам необходимо внести данные в наши таблицы. На сайтах, вы обычно вводите информацию в какие-нибудь html-формы, затем сценарий на каком-либо языке (php, java...) извлекает эти данные из формы и заносит их в БД. Делает он это посредством SQL-запроса на внесение данных в базу. Писать сценарии на php мы пока не умеем, а вот отправлять SQL-запросы на внесение данных сейчас научимся.

Для этого используется оператор INSERT . Синтаксис можно использовать двух видов. Первый вариант используется для внесения данных во все поля таблицы:

INSERT INTO имя_таблицы VALUES ("значение_первого_столбца","значение_второго_столбца", ..., "значение_последнего_столбца");


Давайте попробуем внести в нашу таблицу users следующие значения:

INSERT INTO users VALUES ("1","sergey", "[email protected]", "1111");

Второй вариант используется для внесения данных в некоторые поля таблицы:

INSERT INTO имя_таблицы ("имя_столбца", "имя_столбца") VALUES ("значение_первого_столбца","значение_второго_столбца");


В нашей таблице users все поля обязательны для заполнения, но наше первое поле имеет ключевое слово - AUTO_INCREMENT (т.е. оно заполняется автоматически), поэтому мы можем пропустить этот столбец:

INSERT INTO users (name, email, password) VALUES ("valera", "[email protected]", "2222");

Если бы у нас были поля с типом NULL, т.е. необязательные для заполнения, мы бы тоже могли их проигнорировать. А вот если попытаться оставить пустым поле со значением NOT NULL, то сервер выдаст сообщение об ошибке и не выполнит запрос. Кроме того, при внесении данных сервер проверяет связи между таблицами. Поэтому вам не удастся внести в поле, являющееся внешним ключом, значение, отсутствующее в связанной таблице. В этом вы убедитесь, внося данные в оставшиеся две таблицы.

Но прежде внесем информацию еще о нескольких пользователях. Чтобы добавить сразу несколько строк, надо просто перечислять скобки со значениями через запятую:

Теперь внесем данные во вторую таблицу - topics (темы). Все тоже самое, но надо помнить, что значения в поле id_author должны присутствовать в таблице users (пользователи):

Теперь давайте попробуем внести еще одну тему, но с id_author, которого в таблице users нет (т.к. мы внесли в таблицу users только 5 пользователей, то id=6 не существует):

Сервер выдает ошибку и говорит, что не может внести такую строку, т.к. в поле, являющемся внешним ключом, стоит значение, отсутствующее в связанной таблице users.

Теперь внесем несколько строк в таблицу posts (сообщения), помня, что в ней у нас 2 внешних ключа, т.е. id_author и id_topic, которые мы будем вносить должны присутствовать в связанных с ними таблицах:

Итак, у нас есть 3 таблицы, в которых есть данные. Встает вопрос - как посмотреть, какие данные хранятся в таблицах. Этим мы и займемся на следующем уроке.