Меню

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.1k7 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,4901 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,81417 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

27k13 gold badges62 silver badges101 bronze badges

answered Dec 18, 2015 at 7:40

Sachin Parse's user avatar

Sachin ParseSachin Parse

1,20511 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

22.7k11 gold badges84 silver badges99 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

48.6k51 gold badges151 silver badges210 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

18.8k30 gold badges130 silver badges220 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,6312 gold badges14 silver badges30 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

4191 gold badge6 silver badges18 bronze badges

I was creating a DB with mySQL, and this error appeared:

Can’t create table ‘projectefinal.apuntats’ (errno: 150)

I’ve got this:

    CREATE DATABASE IF NOT EXISTS projectefinal

CREATE TABLE IF NOT EXISTS usuaris(
    id INT NOT NULL AUTO_INCREMENT,
    nom TEXT NOT NULL,
    cognoms TEXT NOT NULL,
    dni VARCHAR(9) NOT NULL,
    aturat BOOLEAN NOT NULL,
    PRIMARY KEY(id),
    UNIQUE(dni)
);

CREATE TABLE IF NOT EXISTS cursos(
    id INT NOT NULL AUTO_INCREMENT,
    nom TEXT NOT NULL,
    maximspersones INT NOT NULL,
    PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS apuntats(
    id INT NOT NULL AUTO_INCREMENT,
    idcurs INT NOT NULL,
    idusuari INT NOT NULL,
    coneixements TEXT,
    motiu TEXT,
    FOREIGN KEY(idcurs)
        REFERENCES id(curs)
        ON DELETE CASCADE,
    FOREIGN KEY(idusuari)
        REFERENCES id(usuaris)
        ON DELETE CASCADE,
    PRIMARY KEY(id)
);

I’ve read before that may happends because a table is not created, but it is, I went one by one («usuaris» first, «curs» for the second, and finally «apuntats») and it gave me that error. Any help on how to fix it?

Thanks again, as always!

Умение создать таблицу — важный, даже можно сказать фундаментальный навык в работе с 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».

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Create process код ошибки 225
  • Create process код ошибки 2 не удается найти указанный файл на вин10