Вие сте T-SQL разработчик, изучаващ основите на MySQL? След това едно от нещата, които може да искате да научите, е операторът на MySQL CREATE TABLE. Освен това, най-бързият начин да научите нова платформа SQL база данни е като сравните нейната обща функционалност и синтаксис.
Това е, което ще направим днес. Но пълният синтаксис е много. И така, ние ще покрием само 5 основни точки, за да ви накараме да работите с командата MySQL CREATE TABLE.
Въпреки това, преди да продължим, нека изясним няколко точки:
- Версията на MySQL, използвана тук, е MySQL 8 с помощта на машината за съхранение InnoDB.
- Версията на SQL Server, използвана тук, е SQL Server 2019.
Звучи добре? Да започнем.
Създайте изявление за таблица в MySQL и T-SQL
Нека започнем сравнението, като дефинираме името на таблицата.
Една от забележимите синтактични разлики в MySQL CREATE TABLE е липсата на име на схема. Ето как става:
CREATE TABLE database_name.table_name
Забелязахте ли името на таблицата, предшествано от името на базата данни? Ето един формат, еквивалентен на T-SQL, който познавате:
CREATE TABLE database_name.schema_name.table_name
Защо? Тъй като в MySQL схемата е синоним на база данни. Имената на базата данни и схемите са по избор. Ако обаче трябва да създадете таблица в друга база данни в същия скрипт, това е задължително.
Това е вярно. Използването на квадратни скоби в имената на таблици и колони ще предизвика грешка в MySQL. Вместо това трябва да използвате чифт обратни отметки, за да затворите идентификатори. Фигура 1 показва къде го намирате на клавиатурна подредба в САЩ:
Сега вижте извадката:
-- MySQL CREATE TABLE
CREATE TABLE `testdatabase`.`person` (
`BusinessEntityID` INT NOT NULL,
`PersonType` NCHAR(2) NOT NULL,
`Title` VARCHAR(8) NULL,
`FirstName` NVARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NULL,
`LastName` VARCHAR(50) NOT NULL,
`Suffix` NVARCHAR(10) NULL,
`EmailPromotion` INT NOT NULL,
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
PRIMARY KEY (`BusinessEntityID`));
От примерния код по-горе, идентификаторите на имената на таблицата и колоните са затворени в обратни отметки. Ако не сте свикнали да затваряте имена на таблици и колони с това, повярвайте ми, не сте сами.
Проверете еквивалентния код в T-SQL по-долу:
-- T-SQL CREATE TABLE
CREATE TABLE [testdatabase].[dbo].[Person](
[BusinessEntityID] [int] NOT NULL,
[PersonType] [nchar](2) NOT NULL,
[Title] [nvarchar](8) NULL,
[FirstName] [nvarchar](50) NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Suffix] [nvarchar](10) NULL,
[EmailPromotion] [int] NOT NULL,
[ModifiedDate] [datetime] NOT NULL DEFAULT GETDATE(),
CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY
(
[BusinessEntityID] ASC
)
) ON [PRIMARY]
Разбира се, не е необходимо да включвате тези идентификатори. Но ако използвате резервни думи или интервал в имената на таблици или колони, ще възникне грешка.
Как да Създаване на временна таблица
Обичате ли временните маси? Тогава MySQL ще ви позволи да въведете повече, за да дефинирате временна таблица. Вижте извадката:
-- MySQL Temporary Table
CREATE TEMPORARY TABLE `MyTempTable`
Междувременно T-SQL кодерите се използват за # символ преди името на таблицата. Вижте еквивалентния код от горното:
-- T-SQL Temporary Table
CREATE TABLE #MyTempTable
Приключихме с дефинициите и имената на таблици. Нека продължим с дефинициите на колони.
Синтаксис на колона на MySQL
Не можете да имате основна SQL таблица без колони. И така, какви прилики и разлики има между MySQL и SQL Server?
Имена на колони и типове данни
Вече знаете за бектиковете. Всичко друго основно за имената на колони и типове данни е същото в MySQL и T-SQL. Вижте извадката по-долу:
CREATE TABLE `testdatabase`.`people`
(
`ID` INT,
`LastName` VARCHAR(50),
...
);
Има обаче още.
Нулиране на колона
Колоните могат да бъдат нулеви или не. Можете да направите това, като добавите NULL или NOT NULL в дефиницията на колоната.
Нека разширим предишния ни пример.
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NULL,
...
);
Това е почти същото като T-SQL. Какво ще кажете за стойностите по подразбиране?
Стойности по подразбиране на колоната
Следват стойностите на колоната по подразбиране. Те са удобни, когато вмъквате запис, но не сте посочили конкретна стойност за колона. Нека разширим още малко предишния пример:
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NULL,
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
...
);
ModifiedDate колоната по подразбиране на текущата системна дата и час. Ако направите INSERT в тази таблица като тази по-долу, винаги ще има стойност за ModifiedDate .
INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName)
VALUES
(1,'Kirk','James','Tiberius');
Работи според очакванията след INSERT. Ето екранна снимка от dbForge Studio за MySQL:
MySQL Създаване на таблица с първични, чужди и уникални ключове
Както във всяка SQL платформа, можете да дефинирате правила за данни от колона на таблицата, като използвате ограничения в MySQL. Тъй като това е важно за дизайна на таблицата, трябва да вземем предвид следната точка.
Разработчикът на T-SQL трябва да се чувства като у дома си с MySQL първични ключове, външни ключове и уникални ключове.
Първичен ключ
Можете да дефинирате една или повече колони като първичен ключ. Синтаксисът е почти същият като в SQL Server. Някакви изключения? да. Това е използването на клъстерирани и неклъстерирани индекси. Но нека запазим обсъждането на това в следващия раздел.
Засега се фокусираме върху синтаксиса на първичните ключове. Ето същия пример, който имахме по-рано, но добавяме колоната ID като първичен ключ:
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL PRIMARY KEY,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NULL,
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW()
);
Лесно, нали?
Но какво ще стане, ако имате нужда от няколко колони? Както в T-SQL, имате 2 опции. Вижте примерите по-долу:
-- OPTION 1: Let MySQL generate the constraint name
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
PRIMARY KEY (`LastName`,`FirstName`,`MiddleName`)
);
-- OPTION 2: Specify your constraint name
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
CONSTRAINT `pk_name` PRIMARY KEY (`LastName`, `FirstName`, `MiddleName`)
);
Това е всичко за първичните ключове.
Външен ключ
Друго важно ограничение е външният ключ. Това се използва за кръстосано препращане на таблица към друга таблица:
CREATE TABLE `testdatabase`.`address`
(
`ID` int NOT NULL PRIMARY KEY,
`parent_id` int NOT NULL,
`full_address` varchar(100) NOT NULL,
CONSTRAINT `FK_address_parent_id` FOREIGN KEY (`parent_id`)
REFERENCES `people` (`ID`)
);
Видяхте ли приликата с T-SQL?
Уникален ключ
Понякога искате да сте сигурни, че данните, вмъкнати в таблица, са уникални. MySQL също поддържа уникални ключове. Ето един пример:
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
CONSTRAINT `PK_people_id` PRIMARY KEY (`ID`),
CONSTRAINT `IDX_name` UNIQUE KEY (`LastName`,`FirstName`,`MiddleName`)
);
Горният код ще гарантира, че към таблицата ще бъдат добавени само уникални имена.
Създаване на примери за индекс на таблици (клъстерирани и негрупирани)
В предишните примери сте виждали създадени първични и вторични ключове. Но къде са клъстерираните и неклъстерираните индекси? Това е забележимо, защото в SQL Server изрично посочвате ключовата дума CLUSTERED, за да направите клъстериран индекс.
Интересното е, че MySQL няма CLUSTERED или NONCLUSTERED ключови думи. Как създавате клъстерирани индекси?
прост. Просто посочете колоната(ите) като първичен ключ и машината за съхранение на InnoDB ще направи това клъстериран индекс. В примера по-долу ID е първичният ключ И клъстерираният индекс.
CREATE TABLE `testdatabase`.`people`
(
`ID` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`LastName` VARCHAR(50) NOT NULL,
`FirstName` VARCHAR(50) NOT NULL,
`MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
`ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
CONSTRAINT `IDX_name` UNIQUE KEY (`LastName`,`FirstName`,`MiddleName`)
);
Ако не посочите първичен ключ, всеки уникален индекс ще се използва като клъстериран индекс.
От друга страна, ако нямате първичен ключ и уникален индекс, InnoDB създава скрит клъстериран индекс. Проверете доказателството тук.
Следващият въпрос е какво ще кажете за неклъстериран индекс?
Ако вече имате първичен ключ като клъстериран индекс, всички други индекси ще бъдат неклъстерирани или вторични. Освен това можете да имате само един клъстериран индекс.
Следващият раздел ще обсъди уникален синтаксис за MySQL CREATE TABLE, който не се намира в T-SQL.
Синтаксис за клониране и копиране на MySQL таблица
Нека да обсъдим клонирането на масата. Можем да го направим в MySQL CREATE TABLE. След това ще покажем еквивалента на T-SQL.
Примерът по-долу създава таблицата със същата структура като първата таблица с помощта на CREATE TABLE...LIKE.
CREATE TABLE `people2` LIKE `people`
Току-що клонирахме хората таблица в хора2 . Това обаче е само структурата на хората таблица, която е копирана, а не данните. Той също така копира ключовите ограничения и индекси на оригиналната таблица. Доста удобно, ако питате мен.
Най-близкият T-SQL еквивалент е това:
-- T-SQL way of cloning a table. The indexes & key constraints are not included,
-- though
SELECT * INTO people2
FROM people
WHERE 1=0 -- this will cause the SELECT to return an empty result set.
Но какво ще стане, ако искате данните? След това CREATE TABLE...SELECT е отговорът:
CREATE TABLE `people3` AS
SELECT * FROM `people`;
Каквито и данни да са в хора таблица, тя ще бъде копирана в people3 маса. Тази команда обаче няма да включва индекси и ограничения.
Сега най-близкият еквивалент на T-SQL е това:
-- T-SQL table copying
SELECT * INTO people3
FROM people
Заключение
Надявам се, че точките по-горе могат да ви помогнат да започнете да използвате MySQL CREATE TABLE от гледна точка на разработчик на SQL Server T-SQL.
Някои от вас ще предпочетат да използват графични инструменти. Но по-късно ще откриете, че търсите препратка, когато трябва да създадете работни таблици във вашите запомнени процедури или ad-hoc скриптове. Или просто сте от типа, който търси повече контрол, като пишете всичко. Във всеки случай, едно гише, сравняващо основния синтаксис, може да бъде спасение.
Ако ви харесва тази статия, не се колебайте да я споделите в любимите си социални медии.
Приятно кодиране на всички.