MySQL "TABELLE ERSTELLEN, WENN NICHT EXISTIERT" -> Fehler 1050


74

Verwenden des Befehls:

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

Wenn Sie dies zweimal im MySQL Query Browser ausführen, erhalten Sie Folgendes:

Tabelle 't1' existiert bereits Fehler 1050

Ich hätte gedacht, dass das Erstellen der Tabelle "IF NOT EXISTS" keine Fehler auslösen würde. Vermisse ich etwas oder ist das ein Fehler? Ich verwende Version 5.1 . Vielen Dank.

Antworten:


55

Funktioniert gut für mich in 5.0.27

Ich erhalte nur eine Warnung (kein Fehler), dass die Tabelle vorhanden ist.


5
Danke Eli, du hast recht. Es ist meine Client-Software von Drittanbietern, die diese Warnung als Ausnahme für mich auslöst, was mein Problem ist.
user199559

30

Wie bereits erwähnt, handelt es sich um eine Warnung, nicht um einen Fehler. Wenn Sie jedoch möchten, dass die Dinge ohne Warnungen ausgeführt werden, können Sie diese Warnung deaktivieren und anschließend wieder aktivieren, wenn Sie fertig sind.

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

Interessante Idee, wenn stumpf. In einigen Sprachen wie CSS sind Warnungen so gut wie nutzlos, während in anderen Sprachen wie PHP Warnungen sehr wichtig sind. Obwohl ich kein SQL-Meister bin, bin ich gespannt, welche anderen Warnungen auftreten können und ob das Ignorieren dieser Warnungen zu potenziellen Angriffsmethoden führen kann.
John

9

Mit der folgenden Abfrage können Sie eine Tabelle für eine bestimmte Datenbank in MySql erstellen.

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`)

);

7
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`)
);***

3

Ich habe eine Lösung für ein Problem, das möglicherweise auch für Sie gilt. Meine Datenbank befand sich in einem Zustand, in dem ein DROP TABLEFehler aufgetreten ist, weil die Tabelle nicht gefunden werden konnte ... aber aCREATE TABLE auch ein Fehler, weil MySQL glaubte, dass die Tabelle vorhanden ist. (Dieser Status kann leicht mit Ihrer IF NOT EXISTS-Klausel in Konflikt geraten.)

Ich fand schließlich diese Lösung :

sudo mysqladmin flush-tables

Für mich ohne das habe sudoich folgenden Fehler bekommen:

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

(Läuft unter OS X 10.6)


0

Erstellen Sie eine MySQL-Verbindung mit dem folgenden Parameter. "'raise_on_warnings': False". Die Warnung wird ignoriert. z.B

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

Ich hatte das gleiche Problem in Python. Ich hatte raise_on_warnings auf "true" gesetzt, daher wurde eine Ausnahme ausgelöst, obwohl ich sie verwendet habe IF NOT EXISTS.
Pikamander2

0

Ich hatte ein ähnliches Problem wie @CraigWalker unter Debian: Meine Datenbank befand sich in einem Zustand, in dem ein Fehler aufgetreten ist, DROP TABLEweil die Tabelle nicht gefunden werden konnte, aber auch ein Fehler , CREATE TABLEweil MySQL glaubte, dass die Tabelle noch vorhanden ist. Der kaputte Tisch existierte also noch irgendwo, obwohl er nicht da war, als ich in phpmyadmin nachschaute.

Ich habe diesen Status erstellt, indem ich einfach den gesamten Ordner kopiert habe, der eine Datenbank mit einigen MyISAMund einigen InnoDBTabellen enthielt

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

(Dies wird nicht empfohlen!)

Alle InnoDB-Tabellen waren in der neuen Datenbank testin phpmyadmin nicht sichtbar .

sudo mysqladmin flush-tables hat auch nicht geholfen.

Meine Lösung: Ich musste die neue Testdatenbank mit löschen drop database testund mysqldumpstattdessen kopieren mit :

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

0

Nun, es gibt bereits viele Antworten und viele machen auch Sinn.

Einige erwähnten, es sei nur eine Warnung, andere gaben eine vorübergehende Möglichkeit, Warnungen zu deaktivieren. All dies funktioniert, erhöht jedoch das Risiko, wenn die Anzahl der Transaktionen in Ihrer Datenbank hoch ist .

Ich bin heute auf eine ähnliche Situation gestoßen und hier ist die Frage, die ich mir gestellt habe ...

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;
/

Dies ist einfach. Wenn beim Ausführen der Abfrage eine Ausnahme auftritt, wird diese unterdrückt. und Sie können das gleiche für SQLoder verwenden Oracle.


0

Wenn jemand diesen Fehler nach einem Phpmyadmin-Export erhält, wurde dies durch die Verwendung der benutzerdefinierten Optionen und das Hinzufügen der Anweisungen "drop tables" behoben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.