2011-01-17 7 views

Antwort

2

Zwei Vorschläge für Sie, eine oder beide, die auf den Angaben der Daten abhängig arbeiten können Sie zu speichern sind versuchen:

UND/ODER

  • Implementieren INSERT, UPDATE und Trigger DELETE, um den Zugriff auf die Daten (Sie möchten die Daten füllen zunächst vor Sie erstellen diese, wieder hängt es von Ihrem Szenario ab)

+0

Ich bin neu bei Triggern ... Könnten Sie mir ein Beispiel für einen Trigger geben, der alle Einfügungen, Aktualisierungen und Löschungen an einer bestimmten Tabelle stoppt? – benjisail

+0

Überprüfen Sie die in http://stackoverflow.com/questions/2981930/mysql-trigger-to-prevent-insert-under-certain-conditions angegebene Problemumgehung. – kvista

+0

BTW, denken Sie daran, dass Sie auch einen AFTER-Trigger schreiben können an " bereinigen "schlechte Daten. Im Idealfall würden Constraints verhindern, dass die Daten von vornherein in die Tabelle gelangen. Wenn Sie jedoch an die Grenzen dessen, was ich oben beschrieben habe, stoßen (und ich gebe zu, Trigger erfüllen nicht alle Anforderungen), könnten Sie eine "Bereinigung" vornehmen "Annäherung nach der Tat. Beachten Sie außerdem, dass Sie, wenn Sie sicherstellen müssen, dass nur eine Zeile in der Tabelle für Leser vorhanden ist, immer eine Sicht aus der Basistabelle erstellen können, die die Anzeige von Daten verhindert, die Sie nicht haben möchten Weg. – kvista

0

Sie können den Einsatz auf Tabellen-Privilegien machen (vorausgesetzt, wenn Sie die entsprechenden Berechtigungen festgelegt haben Einsatz zu blockieren/löschen, und Sie sollten nicht die Privilegien mehr aktualisieren, jedoch hat jeder Benutzer die Privilegien erneut die Rechte außer Kraft setzen können)

legen Sie die one-and-only-one Rekord ersten dann durch disable INSERT, UPDATE, DROP in Spalte Table_priv

 
mysql> desc tables_priv; 
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+ 
| Field  | Type                             | Null | Key | Default   | Extra | 
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+ 
| Host  | char(60)                            | NO | PRI |     |  | 
| Db   | char(64)                            | NO | PRI |     |  | 
| User  | char(16)                            | NO | PRI |     |  | 
| Table_name | char(64)                            | NO | PRI |     |  | 
| Grantor  | char(77)                            | NO | MUL |     |  | 
| Timestamp | timestamp                            | NO |  | CURRENT_TIMESTAMP |  | 
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view') | NO |  |     |  | 
| Column_priv | set('Select','Insert','Update','References')                   | NO |  |     |  | 
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+ 
8 rows in set (0.00 sec) 
0

Check-in mySQL IF-Anweisung in den Privilegien hinzuzufügen.

IF (SELECT count(*) FROM myTable) = 1 
    //your SQL code here. 
1

Versuchen Sie folgendes:

CREATE TABLE foo (x INT NOT NULL PRIMARY KEY CHECK (x = 1), col1 INT NOT NULL, col2 INT NOT NULL); 
+1

Es scheint, dass, wie das MySQL-Referenzhandbuch sagt: „Die CHECK-Klausel analysiert wird aber von all Speicher-Engines ignoriert.“ – benjisail

+1

Benjisail, Sie haben Recht. MySQL saugt. Aber es wird in allen anderen großen DBMS funktionieren. – sqlvogel

0

Wenn Ihre Datenbank auf 'strenge' Modus eingestellt ist, können Sie eine Tabelle wie schaffen diese:

create table foo (id ENUM ('SYSROW') nicht null, (andere Spaltendefinitionen) Primärschlüssel (id));

0
 
    create table if not exists myTable (
     ID int not null 
    ) engine=innodb; 

    select 'create trigger tbi_myTable'; 
    drop trigger if exists tbi_myTable; 
    delimiter // 
    create trigger tbi_myTable 
     before insert on myTable 
     for each row 
    begin 
     if (select count(1) from myTable) > 0 then 
      -- Signal is only in 5.6 and above use another way to raise an error: if less than 5.6 
      SIGNAL SQLSTATE '50000' SET MESSAGE_TEXT = 'Cannot insert into myTable only one row alowed!'; 
     end if; 
    END // 
    delimiter ; 
    insert into myTable values (1); 

    -- This will generate an error 
    insert into myTable values (2); 

    -- This will only have one row with "1" 
    select * from myTable; 
3
CREATE TABLE `myTable` (
    `id` enum('1') NOT NULL, 
    `MyValue1` int(6) DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='The ENUM(''1'') construct as primary key is used to prevent that more than one row can be entered to the table'; 
+2

Obwohl dies eine gute Antwort sein könnte, überlegen Sie bitte, warum dies die richtige Lösung ist und was genau Sie tun :) –

1

Der einfachste Ansatz ist es, eine Spalte zu erstellen, die nur einen rechtlichen Wert hat, dann not null unique es zu erklären.

Dies zwingt die Tabelle, nicht mehr als eine Zeile zu haben, aber immer noch Null-Zeilen erlaubt. Wenn Sie das Entfernen der einzigen Zeile verhindern möchten, verwenden Sie den Trigger-Ansatz in einer anderen Antwort.

create table example( 
    enforce_one_row enum('only') not null unique default 'only', 
    ... your columns .... 
); 
Verwandte Themen