“Кража” таблицы
Для начала рассмотрим пример наиболее простого создания таблицы из уже существующей.
Мы создали копию таблицы на основе запроса и невыполнимого условия!
Ранее я рассматривал как создавать БД и таблицы в ней из программы WorkBench. Это достаточно просто. В данном же посте постараюсь рассмотреть вопрос создания БД и таблиц прямо из консольного клиента MySQL.exe
Это позволит понимать синтаксис MySQL на более глубинном уровне и создавать БД и таблицы универсально – с помощью запросов из любых IDE, например Delphi.
Просмотр существующих БД на сервере
Единственное, что может удивить у меня исполнение команд идет после символов //, а не после точки с запятой, потому что я менял delimiter во время создания процедуры. В вашем случае,скорее всего будет точка с запятой. В следующем примере вернул delimiter на место, написав delimiter ;
Выбор БД для работы
Просмотр таблиц в выбранной БД
Создание БД в MYSQL.exe
Удаление БД в MySQL
Создание таблиц в БД
Для начала, я взял пример создания одной из таблиц из программы WorkBench… (это часть скрипта из Workbench)
CREATE TABLE IF NOT EXISTS SQL_GroupBy
.Sales2
(
Primary_id
INT NOT NULL AUTO_INCREMENT ,
Salesman
VARCHAR(45) NOT NULL DEFAULT ‘DefaultSalesman’ ,
SalesAmount
INT NOT NULL DEFAULT 50000 ,
PRIMARY KEY (Primary_id
) )
ENGINE = InnoDB;
Рассмотрим код. В принципе ничего сложного – создаем таблицу, если её не существует в БД SQL_GroupBy.Создаем поля Primary_id, Salesman и так далее. Описываем типы полей, INT Varchar(45), указываем параметр NOT NULL, то есть поле не может быть незаполненным. Там, где указано DEFAULT – назначено значение по умолчанию. ENGINE = InnoDB; – это разновидность таблицы, см. описание на википедии. То есть можно выбирать и не INNO DB, но в INNO DB есть транзакции.
Полное описание синтаксиса создания таблиц с сайта MySQL.ru
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] или PRIMARY KEY (index_col_name,...) или KEY [index_name] (index_col_name,...) или INDEX [index_name] (index_col_name,...) или UNIQUE [INDEX] [index_name] (index_col_name,...) или FULLTEXT [INDEX] [index_name] (index_col_name,...) или [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] или CHECK (expr) type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] или SMALLINT[(length)] [UNSIGNED] [ZEROFILL] или MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] или INT[(length)] [UNSIGNED] [ZEROFILL] или INTEGER[(length)] [UNSIGNED] [ZEROFILL] или BIGINT[(length)] [UNSIGNED] [ZEROFILL] или REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] или DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] или FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] или DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] или NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] или CHAR(length) [BINARY] или VARCHAR(length) [BINARY] или DATE или TIME или TIMESTAMP или DATETIME или TINYBLOB или BLOB или MEDIUMBLOB или LONGBLOB или TINYTEXT или TEXT или MEDIUMTEXT или LONGTEXT или ENUM(value1,value2,value3,...) или SET(value1,value2,value3,...) index_col_name: col_name [(length)] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM } или AUTO_INCREMENT = # или AVG_ROW_LENGTH = # или CHECKSUM = {0 | 1} или COMMENT = "string" или MAX_ROWS = # или MIN_ROWS = # или PACK_KEYS = {0 | 1 | DEFAULT} или PASSWORD = "string" или DELAY_KEY_WRITE = {0 | 1} или ROW_FORMAT= { default | dynamic | fixed | compressed } или RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# или UNION = (table_name,[table_name...]) или INSERT_METHOD= {NO | FIRST | LAST } или DATA DIRECTORY="абсолютный путь к каталогу" или INDEX DIRECTORY="абсолютный путь к каталогу" select_statement: [IGNORE | REPLACE] SELECT ... (любое корректное выражение SELECT) |
Создание внешних ключей при создании таблицы (дочерней таблицы)
Официальный синтаксис выглядит таким образом
1 2 3 |
[CONSTRAINT symbol] FOREIGN KEY (index_col_name, ...) REFERENCES table_name (index_col_name, ...) [ON DELETE CASCADE | ON DELETE SET NULL] |
Итак, создадим дочернюю таблицу (сделаем дубль одной из таблиц и пропишем в ней внешний ключ) в WorkBench, и скопируем код из скрипта. В коде ниже, я выделил жирным шрифтом то, что относится к определению таблицы как дочерней.
CREATE TABLE IF NOT EXISTS SQL_GroupBy
.Sales_child
(
Primary_id
INT NOT NULL AUTO_INCREMENT ,
Salesman
VARCHAR(45) NOT NULL DEFAULT ‘DefaultSalesman’ ,
SalesAmount
INT NOT NULL DEFAULT 50000 ,
PRIMARY KEY (Primary_id
) ,
CONSTRAINT Sales_id
FOREIGN KEY (Primary_id
) REFERENCES SQL_GroupBy
.Sales
(Primary_id
)
ON DELETE NO ACTION ON UPDATE NO ACTION)
ENGINE = InnoDB;
Применим этот код для создания таблицы в программе MySQL.exe
Как видно – таблица успешно создалась и является дочерней по отношению к таблице Sales из за наличия Foreign ключа.
Добавление внешних ключей в существующую таблицу
1 2 |
ALTER TABLE yourtablename ADD CONSTRAINT FOREIGN KEY (...) REFERENCES anothertablename(...) |
[block id=”mysql-first-steps”]