Create table if not exists mysql ошибка

Using the command:

CREATE TABLE IF NOT EXISTS `test`.`t1` (
    `col` VARCHAR(16) NOT NULL
) ENGINE=MEMORY;

Running this twice in the MySQL Query Browser results in:

Table ‘t1’ already exists Error 1050

I would have thought that creating the table «IF NOT EXISTS» would not throw errors. Am I missing something or is this a bug? I am running version 5.1. Thanks.

Adam Wagner's user avatar

Adam Wagner

15.4k7 gold badges52 silver badges66 bronze badges

asked Oct 30, 2009 at 16:39

user199559's user avatar

Works fine for me in 5.0.27

I just get a warning (not an error) that the table exists;

answered Oct 30, 2009 at 16:47

Eli's user avatar

EliEli

5,5001 gold badge29 silver badges27 bronze badges

1

As already stated, it’s a warning not an error, but (if like me) you want things to run without warnings, you can disable that warning, then re-enable it again when you’re done.

SET sql_notes = 0;      -- Temporarily disable the "Table already exists" warning
CREATE TABLE IF NOT EXISTS ...
SET sql_notes = 1;      -- And then re-enable the warning again

answered Aug 8, 2010 at 12:33

gdt's user avatar

gdtgdt

1,81217 silver badges19 bronze badges

1

You can use the following query to create a table to a particular database in MySql.

create database if not exists `test`;

USE `test`;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

/*Table structure for table `test` */

CREATE TABLE IF NOT EXISTS `tblsample` (

  `id` int(11) NOT NULL auto_increment,   
  `recid` int(11) NOT NULL default '0',       
  `cvfilename` varchar(250)  NOT NULL default '',     
  `cvpagenumber`  int(11) NULL,     
  `cilineno` int(11)  NULL,    
  `batchname`  varchar(100) NOT NULL default '',
  `type` varchar(20) NOT NULL default '',    
  `data` varchar(100) NOT NULL default '',
   PRIMARY KEY  (`id`)

);

bummi's user avatar

bummi

27.1k14 gold badges62 silver badges101 bronze badges

answered Dec 18, 2015 at 7:40

Sachin Parse's user avatar

Sachin ParseSachin Parse

1,27111 silver badges12 bronze badges

create database if not exists `test`;

USE `test`;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

/*Table structure for table `test` */

***CREATE TABLE IF NOT EXISTS `tblsample` (
  `id` int(11) NOT NULL auto_increment,   
  `recid` int(11) NOT NULL default '0',       
  `cvfilename` varchar(250)  NOT NULL default '',     
  `cvpagenumber`  int(11) NULL,     
  `cilineno` int(11)  NULL,    
  `batchname`  varchar(100) NOT NULL default '',
  `type` varchar(20) NOT NULL default '',    
  `data` varchar(100) NOT NULL default '',
   PRIMARY KEY  (`id`)
);***

tedder42's user avatar

tedder42

23.4k13 gold badges86 silver badges100 bronze badges

answered Nov 16, 2017 at 9:28

Balkishan's user avatar

BalkishanBalkishan

2813 silver badges4 bronze badges

I have a solution to a problem that may also apply to you. My database was in a state where a DROP TABLE failed because it couldn’t find the table… but a CREATE TABLE also failed because MySQL thought the table existed. (This state could easily mess with your IF NOT EXISTS clause).

I eventually found this solution:

sudo mysqladmin flush-tables

For me, without the sudo, I got the following error:

mysqladmin: refresh failed; error: 'Access denied; you need the RELOAD privilege for this operation'

(Running on OS X 10.6)

answered Nov 23, 2010 at 0:05

Craig Walker's user avatar

Craig WalkerCraig Walker

49.5k53 gold badges151 silver badges211 bronze badges

0

Create mysql connection with following parameter. «‘raise_on_warnings’: False». It will ignore the warning. e.g.

config = {'user': 'user','password': 'passwd','host': 'localhost','database': 'db',   'raise_on_warnings': False,}
cnx = mysql.connector.connect(**config)

answered Feb 8, 2014 at 10:25

Vinay's user avatar

VinayVinay

4331 gold badge5 silver badges11 bronze badges

1

I had a similar Problem as @CraigWalker on debian: My database was in a state where a DROP TABLE failed because it couldn’t find the table, but a CREATE TABLE also failed because MySQL thought the table still existed. So the broken table still existed somewhere although it wasn’t there when I looked in phpmyadmin.

I created this state by just copying the whole folder that contained a database with some MyISAM and some InnoDB tables

cp -a /var/lib/mysql/sometable /var/lib/mysql/test

(this is not recommended!)

All InnoDB tables where not visible in the new database test in phpmyadmin.

sudo mysqladmin flush-tables didn’t help either.

My solution: I had to delete the new test database with drop database test and copy it with mysqldump instead:

mysqldump somedatabase -u username -p -r export.sql
mysql test -u username -p < export.sql

answered Jun 22, 2017 at 4:13

rubo77's user avatar

rubo77rubo77

19.4k31 gold badges133 silver badges225 bronze badges

Well there are lot of answeres already provided and lot are making sense too.

Some mentioned it is just warning and some giving a temp way to disable warnings. All that will work but add risk when number of transactions in your DB is high.

I came across similar situation today and here is the query I came up with…

declare
begin
  execute immediate '
    create table "TBL" ("ID" number not null)';
  exception when others then
    if SQLCODE = -955 then null; else raise; end if;
end;
/

This is simple, if exception come while running query it will be suppressed. and you can use same for SQL or Oracle.

answered Apr 23, 2020 at 11:16

Kunal Vohra's user avatar

Kunal VohraKunal Vohra

2,6852 gold badges14 silver badges33 bronze badges

If anyone is getting this error after a Phpmyadmin export, using the custom options and adding the «drop tables» statements cleared this right up.

HoldOffHunger's user avatar

answered Dec 2, 2018 at 17:44

nizz0k's user avatar

nizz0knizz0k

4611 gold badge7 silver badges21 bronze badges

This article will discuss the script to create a table in MySQL only if it does not already exist. We will be using the IF NOT EXISTS clause within the create table script.

Further, in the examples, we will be writing create table scripts using the IF NOT EXISTS clause and without it to analyze the difference between both.

Let us get started by creating the table. We are assuming that this is a fresh creation.

Advertisements

CREATE TABLE IF NOT EXISTS sale_details (
    id INT auto_increment,
    sale_person_name VARCHAR(255),
    no_products_sold INT,
    sales_department VARCHAR(255),
    primary key (id)
);

Action Output:-

image_1

Output Message in image_1 shows that table is created successfully.

Let us re-run the create table statement.

CREATE TABLE IF NOT EXISTS sale_details (
    id INT auto_increment,
    sale_person_name VARCHAR(255),
    no_products_sold INT,
    sales_department VARCHAR(255),
    primary key (id)
);

Action Output:-

image_2

The output in image_2 shows a warning with the below message response.

Action Output Message:-

0 row(s) affected, 1 warning(s): 1050 Table ‘sale_details’ already exists 0.0021 sec

MySQL server has not returned with an error in this case, but what if the IF NOT EXISTS clause is absent in the create table statement. Let us view the situation by removing the IF NOT EXISTS clause and running the statement to create the table again.

CREATE TABLE sale_details (
    id INT auto_increment,
    sale_person_name VARCHAR(255),
    no_products_sold INT,
    sales_department VARCHAR(255),
    primary key (id)
);

Action Output:-

image_3

The highlighted row in the image_3 shows the MySQL server threw an error, this time with the below message.

Action Output Message:-

Error Code: 1050. Table ‘sale_details’ already exists.

READ MORE:

  • MySQL IF EXISTS DROP Table
  • Insert into a MySQL table or update if exists

We hope this article helped with IF NOT EXISTS CREATE TABLE statements. Good Luck!!!

You need to add a widget, row, or prebuilt layout before you’ll see anything here. 🙂

Введение

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

  • Названия таблиц и столбцов.
  • Типы данных столбцов.
  • Атрибуты и ограничения.

Ниже разберем подробнее, как реализовать этот короткий список для MySQL наиболее эффективно.

Синтаксис Create table в MySQL и создание таблиц

Поскольку наш путь в базы данных только начинается, стоит вспомнить основы. Реляционные базы данных хранят данные в таблицах, и каждая таблица содержит набор столбцов. У столбца есть название и тип данных. Команда создания таблицы должна содержать все вышеупомянутое:

    CREATE TABLE table_name 
(
    column_name_1 column_type_1,
    column_name_2 column_type_2,
    ...,
    column_name_N column_type_N,
);

table_name — имя таблицы;

column_name — имя столбца;

column_type — тип данных столбца.

Теперь разберем процесс создания таблицы детально.

Названия таблиц и столбцов

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

Имена могут содержать символы подчеркивания для большей наглядности. Классический пример непонятных названий — table1, table2 и т. п. Использование транслита, неясных сокращений и, разумеется, наличие орфографических ошибок тоже не приветствуется. Хороший пример коротких информативных названий: Customers, Users, Orders, так как по названию таблицы должно быть очевидно, какие данные таблица будет содержать. Эта же логика применима и к названию столбцов.

Максимальная длина названия и для таблицы, и для столбцов — 64 символа.

Типы данных столбцов

Для каждого столбца таблицы будет определен тип данных. Неправильное использование типов данных увеличивает как объем занимаемой памяти, так и время выполнения запросов к таблице. Это может быть незаметно на таблицах в несколько строк, но очень существенно, если количество строк будет измеряться десятками и сотнями тысяч, и это далеко не предел для рабочей базы данных. Проведем краткий обзор наиболее часто используемых типов:

Числовые типы

  • INT — целочисленные значения от −2147483648 до 2147483647, 4 байта.
  • DECIMAL — хранит числа с заданной точностью. Использует два параметра — максимальное количество цифр всего числа (precision) и количество цифр дробной части (scale). Рекомендуемый тип данных для работы с валютами и координатами. Можно использовать синонимы NUMERIC, DEC, FIXED.
  • TINYINT — целые числа от −127 до 128, занимает 1 байт хранимой памяти.
  • BOOL — 0 или 1. Однозначный ответ на однозначный вопрос — false или true. Название столбцов типа boolean часто начинается с is, has, can, allow. По факту это даже не отдельный тип данных, а псевдоним для типа TINYINT (1). Тип настолько востребован на практике, что для него в MySQL создали встроенные константы FALSE (0) или TRUE (1). Можно использовать синоним BOOLEAN.
  • FLOAT — дробные числа с плавающей запятой (точкой).

Символьные

  • VARCHAR(N) — N определяет максимально возможную длину строки. Создан для хранения текстовых данных переменной длины, поэтому память хранения зависит от длины строки. Наиболее часто используемый тип строковых данных.
  • CHAR(N) — как и с varchar, N указывает максимальную длину строки. Char создан хранить данные строго фиксированной длины, и каждая запись будет занимать ровно столько памяти, сколько требуется для хранения строки длиной N.
  • TEXT — подходит для хранения большого объема текста до 65 KB, например, целой статьи.

Дата и время

  • DATE — только дата. Диапазон от 1000-01-01 по 9999-12-31. Подходит для хранения дат рождения, исторических дат, начиная с 11 века. Память хранения — 3 байта.
  • TIME — только время — часы, минуты, секунды — «hh:mm:ss». Память хранения — 3 байта.
  • DATETIME — соединяет оба предыдущих типа — дату и время. Использует 8 байтов памяти.
  • TIMESTAMP — хранит дату и время начиная с 1970 года. Подходит для большинства бизнес-задач. Потребляет 4 байта памяти, что в два раза меньше, чем DATETIME, поскольку использует более скромный диапазон дат.

Бинарные

Используются для хранения файлов, фото, документов, аудио и видеоконтента. Все это хранится в бинарном виде.

  • BLOB — до 65 КБ бинарных данных
  • LARGEBLOB — до 4 ГБ.

Подробный разбор типов данных, включая более специализированные типы, например, ENUM, SET или BIGINT UNSIGNED, будет в отдельной тематической статье.

Практика с примерами

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

  • id — уникальный номер,
  • name — ФИО,
  • position — должность
  • birthday — дата рождения

Синтаксис create table с основными параметрами:

    CREATE TABLE Staff 
(
    id INT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday Date
);

Тут могут появиться вопросы. Откуда MySQL знает, что номер уникален? Если еще нет должности для этого сотрудника, что будет, если оставить поле пустым?
Все это (как и многое другое) придtтся указать с помощью дополнительных параметров — атрибутов.

Часто таблицы создаются и заполняются скриптами. Если мы вызовем команду CREATE TABLE Staff, а таблица Staff уже есть в базе, команда выдаст ошибку. Поэтому перед созданием разумно проверить, содержит ли уже база таблицу Staff. Достаточно добавить IF NOT EXISTS, чтобы выполнить эту проверку в MySQL, то есть вместо

    CREATE TABLE Staff

напишем

    CREATE TABLE IF NOT EXISTS Staff

Повторный запуск команды выведет предупреждение:

    1050 Table 'Staff' already exists

Если таблица уже создана и нужно создать таблицу с тем же именем с «чистого листа», старую таблицу можно удалить командой:

    DROP TABLE table_name;

Атрибуты (ATTRIBUTES) и ограничения (CONSTRAINTS)

PRIMARY KEY

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

Пользы индексов на примерах: для поиска уникального значения среди 10000 строк придется проверить, в худшем случае, все 10000 без индекса, с индексом — всего 14. Поиск по миллиону записей займет не больше в 20 проверок — это реализация идеи бинарного поиска.

Создадим таблицу Staff с номером сотрудника в качестве первичного ключа. Первичный ключ гарантирует нам, что номер точно будет уникальным, а поиск по нему — быстрым.

    CREATE TABLE Staff (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    position VARCHAR(30),
    birthday Date,
    has_children BOOLEAN
);

NOT NULL

При заполнении таблицы мы утверждаем, что значение этого столбца должно быть установлено. Если нет явного указания NOT NULL, и этот столбец не PRIMARY KEY, то столбец позволяет хранить NULL, то есть хранение NULL — поведение по умолчанию. Для первичного ключа это ограничение можно не указывать, так как первичный ключ всегда гарантирует NOT NULL.

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

    CREATE TABLE Staff (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_children BOOLEAN NOT NULL
);

DEFAULT

Можно указать значение по умолчанию, т.е. текст или число, которые будут сохранены, если не указано другое значение. Применяется не ко всем типам: BLOB, TEXT, GEOMETRY и JSON не поддерживают это ограничение.
Эта величина должна быть константой, функция или выражение не допустимы.

Продолжим изменять команду, установив ограничение DEFAULT для поля BOOLEAN.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_children BOOLEAN DEFAULT(FALSE) NOT NULL
);

Для типа данных BOOLEAN можно использовать встроенные константы FALSE и TRUE. Вместо DEFAULT(FALSE) можно указать DEFAULT(0) — эти записи эквивалентны.

AUTO_INCREMENT

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

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_children BOOLEAN DEFAULT(FALSE) NOT NULL
);

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

Интересно, что при CREATE TABLE MySQL не позволяет установить стартовое значение для AUTO_INCREMENT. Можно назначить стартовое значение для счетчика AUTO_INCREMENT уже созданной таблицы. 

Синтаксис:

    ALTER TABLE Staff AUTO_INCREMENT=10001;

Первая запись после такой модификации получит id = 10001.

UNIQUE

Это ограничение устанавливает, что все значения данного столбца будут уникальны в пределах таблицы, и создает индекс. Можно применять к столбцам с поддержкой NULL, но так как NULL будет считаться уникальным значением, возможна только одна NULL-запись.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_child BOOLEAN DEFAULT(0) NOT NULL,
    phone VARCHAR(20) UNIQUE NOT NULL
);

CHECK

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

Синтаксис позволяет устанавливать CHECK как в описании столбца при CREATE TABLE:

    birthday DATE NOT NULL CHECK (birthday > ‘1900-01-01’),

так отдельно от описания столбцов:

    CHECK (birthday > ‘1900-01-01’),

В этих случаях название проверки будет определено автоматически. При вставке данных, не прошедших проверку, будет сообщение об ошибке Check constraint ‘staff_chk_1’ is violated. Ситуация усложняется, когда установлено несколько CHECK, поэтому рекомендуется давать понятное имя.

Воспользуемся полной командой для создания CHECK и определим не только ограничение даты рождения, но и допустимые форматы телефона через регулярное выражение.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position VARCHAR(30),
    birthday DATE NOT NULL,
    has_child BOOLEAN DEFAULT(0) NOT NULL,
    phone VARCHAR(20) UNIQUE NOT NULL,
    CONSTRAINT staff_chk_birthday CHECK (birthday > '1900-01-01'),
    CONSTRAINT staff_chk_phone CHECK (phone REGEXP '[+]?[0-9]{1,3} ?\(?[0-9]{3}\)? ?[0-9]{2}[0-9 -]+[0-9]{2}')
);

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

FOREIGN KEY или внешний ключ

Внешний ключ — это ссылка на столбец или группу столбцов другой таблицы. Это тоже ограничение (CONSTRAINT), так как мы сможем использовать только значения, для которых есть соответствие по внешнему ключу. Создает индекс. Таблицу с внешним ключом называют зависимой.

Синтаксис:

    FOREIGN KEY (column_name1, column_name2) 
REFERENCES external_table_name(external_column_name1, external_column_name2)

Сначала указывается выражение FOREIGN KEY и набор столбцов таблицы, откуда строим FOREIGN KEY. Затем ключевое слово REFERENCES указывает на имя внешней таблицы и набор столбцов этой внешней таблицы. В конце можно добавить операторы ON DELETE и ON UPDATE, с помощью которых настраивается поведение при удалении или обновлении данных в главной таблице. Это делать не обязательно, так как предусмотрено поведение по умолчанию. Поведение по умолчанию запрещает удалять или изменять записи из внешней таблицы, если на эти записи есть ссылки по внешнему ключу.

Возможные опции для ON DELETE и ON UPDATE:

CASCADE: автоматическое удаление/изменение строк зависимой таблицы при удалении/изменении связанных строк главной таблицы.
SET NULL: при удалении/изменении связанных строк главной таблицы будет установлено значение NULL в строках зависимой таблицы. Столбец зависимой таблицы должен поддерживать установку NULL, т.е. параметр NOT NULL в этом случае устанавливать нельзя.
RESTRICT: не даёт удалить/изменить строку главной таблицы при наличии связанных строк в зависимой таблице. Если не указана иная опция, по умолчанию будет использовано NO ACTION, что, по сути, то же самое, что и RESTRICT.

Рассмотрим пример:
Для таблицы Staff было определено текстовое поле position для хранения должности.
Так как список сотрудников в компании обычно больше, чем список занимаемых должностей, есть смысл создать справочник должностей.

    CREATE TABLE Positions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL
);

Поскольку из Staff мы будем ссылаться на Positions, таблица персонала Staff будет зависимой от Positions. Изменим синтаксис CREATE TABLE для таблицы Staff, чтобы должность была ссылкой на запись в таблице Positions.

    CREATE TABLE Staff (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    position_id int,
    birthday DATE NOT NULL,
    has_child BOOLEAN DEFAULT(0) NOT NULL,
    phone VARCHAR(20) UNIQUE NOT NULL,
    FOREIGN KEY (position_id) REFERENCES Positions (id)
);

При CREATE TABLE, чтобы не усложнять описание столбца, рекомендуется указывать внешний ключ и все его атрибуты после перечисления создаваемых столбцов.
Можно ли добавить внешний ключ, если таблица уже создана и в ней есть данные? Можно! Для внесения изменений в таблицу используем ALTER TABLE.

Синтаксис:

    ALTER TABLE Staff
ADD FOREIGN KEY (position_id) REFERENCES Positions(id);

Или в развернутой форме, определяя имя ключа fk_position_id явным образом:

    ALTER TABLE Staff
ADD CONSTRAINT fk_position_id FOREIGN KEY (position_id) REFERENCES Positions(id);

Главное условие в этом случае — согласованность данных. Это значит, что для всех записей внешнего ключа position_id должно найтись соответствие в целевой таблице Positions по столбцу id.

Создание таблиц на основе уже существующих, временные таблицы

Мы рассмотрели создание таблицы с «чистого листа», но есть два других способа:

  • LIKE
  • SELECT

LIKE

Создание таблицы на основе уже существующей таблицы. Копирует структуру — количество, названия и типы столбцов, индексы, все ограничения, кроме внешних ключей. Как мы помним, внешний ключ создает индекс. При создании через LIKE индексы в новой таблице будут построены также, как и в старой, но внешние ключи не скопируются. Таблица будет создана без записей и без счетчиков AUTO_INCREMENT.

Синтаксис: 

    CREATE TABLE new_table LIKE source_table;

SELECT

Можно создать таблицу на основе SELECT-запроса — результат этой выборки будет записан в новую таблицу. Такая таблица не будет иметь индексов, ограничений и ключей. Все столбцы, с учетом порядка, типов данных и названий, будут взяты из запроса — поля из SELECT станут столбцами новой таблицы. При этом можно переопределить изначальные названия полей, что особенно актуально, когда в выборку попадают столбцы с одинаковыми названиями (на уровне таблицы названия столбцов всегда уникальны).

Синтаксис:

    CREATE TABLE new_table [AS] SELECT * FROM source_table;

Разберем пример создания новой таблицы через SELECT, используя две таблицы в выборке — Staff и Positions. В запросе определим три поля: id, staff, position — это будут столбцы новой таблицы StaffData211015 (срез сотрудников на определённую дату). Без присвоения псевдонимов (name as staff, name as position) в выборке получилось бы два одинаковых поля name, что не позволило бы создать таблицу из-за duplicate column name ошибки.

    CREATE TABLE StaffData211015
SELECT s.Id,
       s.name as staff,
       p.name as position
FROM Staff s
JOIN Positions p ON s.position_id = p.id

TEMPORARY

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

Чтобы обозначить таблицу как временную, нужно добавить TEMPORARY в CREATE TABLE:

    CREATE TEMPORARY TABLE table_name;

Работа с уже созданной таблицей

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

Переименование

Ключевая команда — RENAME.

  • Изменить имя таблицы:
    RENAME TABLE old_table_name TO new_table_name;
  • Изменить название столбца:
    ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;

Удаление данных

  • DELETE FROM Staff; — удалит все записи из таблицы. Условие в WHERE позволит удалить только определенные строки, в примере ниже удалим только одну строку с id = 1. DELETE FROM Staff WHERE id = 1;
  • TRUNCATE TABLE Staff; — используется для полной очистки всей таблицы. При TRUNCATE счетчики AUTO_INCREMENT сбросятся. Если бы мы удалили все в строки командой DELETE, то новые строки учитывали бы накопленный за время жизни таблицы AUTO_INCREMENT.
  • DROP TABLE Staff; — команда удаления таблицы.

Изменение структуры таблицы

Команда ALTER TABLE включает в себя множество опций, рассмотрим основные вместе с примерами на таблице Staff.

Добавление столбцов

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

    ALTER TABLE Staff
ADD email VARCHAR(50),
ADD age INT,
ADD has_auto BOOLEAN;

Удаление столбцов

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

    ALTER TABLE Staff
DROP COLUMN age;

Значение по умолчанию

Выставим значение по умолчанию для столбца has_auto:

    ALTER TABLE Staff
ALTER COLUMN has_auto SET DEFAULT(FALSE);

Изменение типа данных столбца

Для столбца name изменим тип данных:

    ALTER TABLE Staff
MODIFY COLUMN name VARCHAR(500) NOT NULL;

Максимальная длина поля была увеличена. Если не указать NOT NULL явно, то поле станет NULL по умолчанию.

Установка CHECK

Добавим ограничение формата для email через регулярное выражение:

    ALTER TABLE Staff
ADD CONSTRAINT staff_chk_email CHECK (email REGEXP '^[^@]+@[^@]+\.[^@]{2,}$');
 

Заключение

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

So, you’re creating a custom SQL query to perform a task in the database. After putting the code together and running it in PHPmyAdmin it responds with a 1064 error. It may look similar to this:

1064 error message

The 1064 error displays any time you have an issue with your SQL syntax, and is often due to using reserved words, missing data in the database, or mistyped/obsolete commands. So follow along and learn more about what the 1064 error is, some likely causes, and general troubleshooting steps.

Note: Since syntax errors can be hard to locate in long queries, the following online tools can often save time by checking your code and locating issues:

  • PiliApp MySQL Syntax Check
  • EverSQL SQL Query Syntax Check & Validator

Causes for the 1064 error

  • Reserved Words
  • Missing Data
  • Mistyped Commands
  • Obsolete Commands

This may seem cryptic since it is a general error pointing to a syntax issue in the SQL Query statement. Since the 1064 error can have multiple causes, we will go over the most common things that will result in this error and show you how to fix them. Follow along so you can get your SQL queries updated and running successfully.

Using Reserved Words

Every version of MySQL has its own list of reserved words. These are words that are used for specific purposes or to perform specific functions within the MySQL engine. If you attempt to use one of these reserved words, you will receive the 1064 error. For example, below is a short SQL query that uses a reserved word as a table name.

CREATE TABLE alter (first_day DATE, last_day DATE);

How to fix it:

Just because the word alter is reserved does not mean it cannot be used, it just has special requirements to use it as the MySQL engine is trying to call the functionality for the alter command. To fix the issue, you will want to surround the word with backticks, this is usually the button just to the left of the “1” button on the keyboard. The code block below shows how the code will need to look in order to run properly.

CREATE TABLE `alter` (first_day DATE, last_day DATE);

Missing Data

Sometimes data can be missing from the database. This causes issues when the data is required for a query to complete. For example, if a database is built requiring an ID number for every student, it is reasonable to assume a query will be built to pull a student record by that ID number. Such a query would look like this:

SELECT * from students WHERE studentID = $id

If the $id is never properly filled in the code, the query would look like this to the server:

SELECT * from students WHERE studentID =

Since there is nothing there, the MySQL engine gets confused and complains via a 1064 error.

How to fix it:

Hopefully, your application will have some sort of interface that will allow you to bring up the particular record and add the missing data. This is tricky because if the missing data is the unique identifier, it will likely need that information to bring it up, thus resulting in the same error. You can also go into the database (typically within phpMyAdmin) where you can select the particular row from the appropriate table and manually add the data.

Mistyping of Commands

One of the most common causes for the 1064 error is when a SQL statement uses a mistyped command. This is very easy to do and is easily missed when troubleshooting at first. Our example shows an UPDATE command that is accidentally misspelled.

UDPATE table1 SET id = 0;

How to fix it:

Be sure to check your commands prior to running them and ensure they are all spelled correctly.

Below is the syntax for the correct query statement.

UPDATE table1 SET id = 0;

Obsolete Commands

Some commands that were deprecated (slated for removal but still allowed for a period of time) eventually go obsolete. This means that the command is no longer valid in the SQL statement. One of the more common commands is the ‘TYPE‘ command. This has been deprecated since MySQL 4.1 but was finally removed as of version 5.1, where it now gives a syntax error. The ‘TYPE‘ command has been replaced with the ‘ENGINE‘ command. Below is an example of the old version:

CREATE TABLE t (i INT) TYPE = INNODB;

This should be replaced with the new command as below:

CREATE TABLE t (i INT) ENGINE = INNODB;

For developers or sysadmins experienced with the command line, get high availability and root access for your application, service, and websites with Cloud VPS Hosting.

Error 1064 Summary

As you can see there is more than one cause for the 1064 error within MySQL code. Now, you know how to correct the issues with your SQL Syntax, so your query can run successfully. This list will be updated as more specific instances are reported.

Умение создать таблицу — важный, даже можно сказать фундаментальный навык в работе с SQL.

В этом руководстве я покажу вам синтаксис инструкции CREATE TABLE на примерах с PostgreSQL и MySQL.

Базовый синтаксис CREATE TABLE

Вот синтаксис инструкции CREATE TABLE (букв. «создать таблицу»):

CREATE TABLE table_name(
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc
);

Начинаем с самой инструкции CREATE TABLE. Сразу за ней идет имя таблицы, которую вы хотите создать.

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

CREATE TABLE teachers();

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

CREATE TABLE teachers;

Точка с запятой после скобок сообщает о том, что это конец SQL-инструкции.

Движки хранения данных MySQL

Согласно документации MySQL, «Движки хранения данных — это компоненты MySQL, управляющие SQL-операциями для разных типов таблиц».

MySQL использует эти движки для осуществления CRUD-операций (создание, чтение, обновление и удаление данных) в базе данных.

В MySQL можно указать тип движка, который вы хотите использовать для вашей таблицы. Для этого используется предложение ENGINE. Если вы его опустите, будет применен дефолтный движок — InnoDB.

CREATE TABLE table_name(
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc
)ENGINE=storage_engine;

От редакции Techrocks. Возможно, вам также будут интересны следующие статьи:

  • Запросы SQL: руководство для начинающих
  • Оператор UPDATE в SQL: разбираем на примерах
  • Выражение CASE в SQL: объяснение на примерах
  • Порядок выполнения SQL-операций

Что такое IF NOT EXISTS?

Вы можете добавить в запрос опциональное предложение IF NOT EXISTS. Оно нужно для проверки, не существует ли уже в базе данных та таблица, которую вы хотите создать. Это предложение можно поместить непосредственно перед именем таблицы.

CREATE TABLE IF NOT EXISTS teachers();

Если такая таблица существует, новая не будет создана.

Если не указать IF NOT EXISTS и попытаться создать заново уже существующую таблицу, получите сообщение об ошибке.

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

CREATE TABLE IF NOT EXISTS teachers();
CREATE TABLE teachers();

Как создавать столбцы в таблице

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

В этом примере мы добавим в таблицу teachers четыре столбца: school_id, name, email и age. Имена столбцов разделяются запятыми.

CREATE TABLE teachers(
    school_id data_type column_constraint, 
    name data_type column_constraint,
    email data_type column_constraint, 
    age data_type column_constraint
);

Согласно документации MySQL, «В MySQL установлено жесткое ограничение в 4096 столбцов на таблицу, но эффективный максимум может быть меньше. Реальный лимит количества столбцов зависит от нескольких факторов».

Впрочем, если вы работаете над маленькими личными проектами, маловероятно, что вам понадобится больше столбцов, чем это разрешено.

Согласно документации PostgreSQL, в этой СУБД установлен лимит в 1600 столбцов на таблицу. Так же, как и в MySQL, максимальное число столбцов может варьироваться в зависимости от количества места на диске или ограничений производительности.

Типы данных в SQL

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

В SQL есть шесть популярных категорий типов данных:

  • числа (int, float, serial, decimal)
  • дата и время (timestamp, data, time)
  • символы и строки (char, varchar, text)
  • Unicode (ntext, nvarchar)
  • бинарные данные (binary)
  • смешанные (xml, table и др.)

Здесь мы не будем разбирать все типы, затронем только самые популярные. Полный список возможных типов данных можно посмотреть в документации: для PostgreSQL и для MySQL.

Что такое SERIAL и AUTO_INCREMENT?

В PostgreSQL тип данных SERIAL — это целое число, которое будет автоматически увеличиваться на единицу при каждом создании новой строки.

Мы можем указать тип данных SERIAL сразу после имени столбца school_id в нашей таблице teachers.

school_id SERIAL

В MySQL вместо SERIAL используется инструкция AUTO_INCREMENT. В примере ниже мы использовали ее с типом данных INT, представляющим целые числа.

school_id INT AUTO_INCREMENT

Если мы добавим в таблицу teachers пять строк и выведем содержимое столбца school_id, будут показаны числа 1, 2, 3, 4, 5. Число автоматически возрастает для каждой новой строки.

Что из себя представляет тип данных VARCHAR?

VARCHAR — это строковые данные переменной длины, где можно установить максимальную длину символов.

Ниже показан пример использования типа данных VARCHAR для столбцов name и email в таблице teachers. Здесь установлена максимальная длина в 30 символов.

name VARCHAR(30) column_constraint,
email VARCHAR(30) column_constraint,

Ограничения столбцов

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

Вот список нескольких самых распространенных ограничений столбцов:

  • PRIMARY KEY — если для столбца установлено это ограничение, данные в нем становятся уникальными идентификаторами строк в таблице
  • FOREIGN KEY — этот ключ связывает данные в одной таблице с данными в другой
  • UNIQUE — все значения в столбце должны быть уникальными
  • NOT NULL — значения не могут быть NULL. NULL — это отсутствие значения
  • CHECK — проверка значения на соответствие логическому выражению

Примеры PRIMARY и FOREIGN ключей

Давайте добавим ограничение PRIMARY KEY (первичный ключ) для столбца school_id в нашей таблице teachers.

В PostgreSQL код будет выглядеть так:

school_id SERIAL PRIMARY KEY

А в MySQL — так:

school_id INT AUTO_INCREMENT PRIMARY KEY

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

CREATE TABLE table_name(
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc
    PRIMARY KEY (column1, column2)
);

Если вы хотите связать одну таблицу с другой, следует использовать FOREIGN KEY (внешний ключ).

Допустим, у нас есть таблица district_employees с первичным ключом district_id. Вот как будет выглядеть код в PostgreSQL:

CREATE TABLE district_employees(
   district_id SERIAL PRIMARY KEY,
   employee_name VARCHAR(30) NOT NULL,
   PRIMARY KEY(district_id)
);

В таблице teachers мы можем установить связь с таблицей district_employees при помощи внешнего ключа:

district_id INT REFERENCES district_employees(district_id),
CREATE TABLE teachers(
    school_id SERIAL PRIMARY KEY,
    district_id INT REFERENCES district_employees(district_id),
    column1 data_type column_constraint,
    column2 data_type column_constraint,
    column3 data_type column_constraint,
    column4 data_type column_constraint,
    ... etc 
);

Примеры NOT NULL, CHECK и UNIQUE

Если бы нам нужно было обеспечить отсутствие значений NULL в столбцах, мы могли бы прописать ограничение NOT NULL.

name VARCHAR(30) NOT NULL

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

Если одно из значений не соответствует условию, мы получим сообщение об ошибке.

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

email VARCHAR(30) UNIQUE

Вот так выглядит наша таблица teachers в итоге:

Полный код в PostgreSQL:

CREATE TABLE teachers(
    school_id SERIAL PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    email VARCHAR(30) UNIQUE,
    age INT CHECK(age >= 18)      
);

И в MySQL:

CREATE TABLE teachers(
    school_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    email VARCHAR(30) UNIQUE,
    age INT CHECK(age >= 18)      
);

Надеюсь, эта статья была вам полезна!

Перевод статьи «How to Create a Table in SQL – Postgres and MySQL Example Query».

  • Create process код ошибки 2 pycharm
  • Create process код ошибки 193
  • Create process returned 2 hello neighbor ошибка
  • Create partition primary ошибка службы виртуальных дисков объект не найден
  • Create partition primary ошибка службы виртуальных дисков истекло время выполнения операции