2016-12-07 1 views
1

Ich habe ein Problem. Ich möchte eine neue Spalte in meine Tabelle einfügen, die auf eine andere Spalte in einer anderen Tabelle verweist. Ich mache so etwas:Spalte mit Fremdschlüssel in Tabelle einfügen.

class m161202_153033_dodanie_informacji_o_obsludze_prawnej_do_pozyczki extends CDbMigration 
{ 
    public function safeUp() 
    { 
      $this->execute("ALTER TABLE loan ADD COLUMN administrator int NOT NULL DEFAULT 15 REFERENCES person (id) ON UPDATE CASCADE ON DELETE NO ACTION;"); 
    } 

    public function safeDown() 
    { 
      $this->execute("ALTER TABLE loan DROP COLUMN administrator;"); 
    } 

} 

Aber wenn ich versuche, diese Migration ich diesen Fehler haben auszuführen:

Foreign key violation: 7 DETAIL: Key (administrator)=(15) doesn't appear in table "person"..

Ich weiß, dass es keine Spalte „Administrator“ in meinem Tisch saugen. Aber ich möchte neue Spalte "Administrator" in Kredit-Tabelle hinzufügen. Ich wollte "Administrator" Fremdschlüssel aus Personentabelle, Spalte "ID" machen. Kannst du mir helfen, was mache ich falsch?

Antwort

0

Der Fehler bedeutet, dass keine Zeile in person mit id gleich 15 ist, die für die Erfüllung der Bedingung erforderlich wäre.

Wenn Sie laufen, dass ALTER TABLE Anweisung, die Tabelle neu geschrieben werden muss, und die neue Spalte mit dem Wert gefüllt 15.

Oft ist es einfacher, eine neue Spalte auf NULL festlegbare zu erstellen und ohne Standardwert (dann ALTER TABLE schreibt die Tabelle nicht um) und verwendet UPDATE, um die neue Spalte zu füllen. Danach können Sie die Spaltendefinition in NOT NULL ändern und einen Standardwert hinzufügen.

+0

Versuchen Aber es ist Reihe persönlich mit id gleich 15. Es ist PK in dieser Tabelle und im die Person mit dieser ID. Und diese PK von Person sollte FK in Darlehen sein. – Speedvees

+0

Sie müssen einen Fehler gemacht haben. Die Fehlermeldung besagt zweifelsfrei, dass zu dem Zeitpunkt, als der "ALTER TABLE" lief, keine Person "ID" 15 hatte. Haben Sie in die falsche Datenbank geschaut? Gibt es mehr als eine Tabelle "Person" in verschiedenen Schemas? –

0

diese

class m161202_153033_dodanie_informacji_o_obsludze_prawnej_do_pozyczki extends CDbMigration 
{ 
    public function safeUp() 
    { 
      $this->execute("INSERT INTO person (id) VALUES (15) ON CONFLICT (id) DO NOTHING;"); 
      $this->execute("ALTER TABLE loan ADD COLUMN administrator int NOT NULL DEFAULT 15 REFERENCES person (id) ON UPDATE CASCADE ON DELETE NO ACTION;"); 
    } 

    public function safeDown() 
    { 
      $this->execute("ALTER TABLE loan DROP COLUMN administrator;"); 
    } 
} 
Verwandte Themen