Sintaxa ALTER TABLE cu dbDelta în WordPress?

8 ian. 2013, 10:58:33
Vizualizări: 15.7K
Voturi: 5

Din cauza unor modificări în baza de date, trebuie să modific o tabelă pentru a adăuga o coloană nouă, dar chiar dacă funcția rulează, tabela nu este modificată. Iată codul ALTER TABLE pe care l-am scris:

$sql = "ALTER TABLE " . $packagetable . " ADD COLUMN price decimal(14,2) NOT NULL AFTER description;";
dbDelta($sql);

Nu am reușit să găsesc nicăieri online sintaxa corectă pentru ALTER TABLE cu dbDelta. EDIT: După ce am analizat instrucțiunea ALTER TABLE din pluginul Gravity Forms, am actualizat instrucțiunea într-o singură linie.

2
Comentarii

Sintaxa este aceeași cu sintaxa generală MySQL, prin urmare această întrebare nu este specifică WordPress. Caută pe Google sintaxa corectă pentru o comandă ALTER TABLE

shea shea
8 ian. 2013 11:11:45

Interogarea MySQL este corectă. Problema este pe partea de dbDelta. Prin urmare, este o interogare WordPress. Am încercat comanda în consola MySQL înainte de a o posta aici.

mehulved mehulved
8 ian. 2013 11:33:31
Toate răspunsurile la întrebare 2
11
17

Ai folosit funcția dbDelta incorect.

Scopul acestei funcții este să îi transmiți o comandă SQL pentru crearea unei tabele.

Dacă tabela nu există, aceasta va fi creată.

Dacă tabela există dar nu se potrivește, va fi modificată până când va corespunde. Acest lucru include adăugarea și actualizarea coloanelor, indexurilor și altor aspecte.

Deci, ceea ce trebuie să faci este să apelezi dbDelta și să îi furnizezi SQL-ul pentru crearea tabelei, nu SQL-ul pentru modificarea acesteia.

Vezi aici explicația din Codex despre adăugarea unei actualizări/modificări la o tabelă folosind dbDelta

Dar nu se oprește aici! dbDelta este o funcție pretențioasă, nu poți pune orice declarație SQL acolo, trebuie să fie formatată corespunzător

Iată ce spune Codex pe aceeași pagină:

  1. Trebuie să pui fiecare câmp pe propria linie în declarația ta SQL.
  2. Trebuie să ai două spații între cuvintele PRIMARY KEY și definiția cheii tale primare.
  3. Trebuie să folosești cuvântul cheie KEY în loc de sinonimul INDEX și trebuie să incluzi cel puțin un KEY.
  4. Nu trebuie să folosești apostroafe sau backtick-uri în jurul numelor de câmpuri.

Și de la altă sursă:

Funcția dbDelta

Așa cum am menționat într-unul din articolele mele, funcția dbDelta are abilitatea de a examina structura curentă a tabelei, o compară cu structura dorită și fie adaugă, fie modifică tabela după necesitate, așa că poate fi foarte utilă pentru actualizările pluginului nostru. Totuși, spre deosebire de multe funcții WordPress, dbDelta este cea mai pretențioasă și problematică. Pentru ca funcția dbDelta să funcționeze, trebuie îndeplinite câteva criterii.

  1. Trebuie să pui fiecare câmp pe propria linie în declarația ta SQL.
  2. Trebuie să ai două spații între cuvintele PRIMARY KEY și definiția cheii tale primare.
  3. Trebuie să folosești cuvântul cheie KEY în loc de sinonimul INDEX și trebuie să incluzi cel puțin un KEY.

Păi, criteriile de mai sus par ușor de îndeplinit. Dar așteaptă până te lovește realitatea.

8 ian. 2013 11:23:48
Comentarii

dbDelta() suportă adăugarea și actualizarea coloanelor. Vezi: http://wordpress.stackexchange.com/q/76926/19726

shea shea
8 ian. 2013 11:37:19

Nu am spus că nu suportă, doar am menționat că modul în care a abordat problema este incorect. Folosește o instrucțiune CREATE pentru tabela dorită, nu o instrucțiune ALTER, iar dbDelta va crea coloanele pentru tine și va modifica tabela până când corespunde cu SQL-ul specificat

Tom J Nowell Tom J Nowell
8 ian. 2013 11:45:15

Am înțeles. Nu mi-am dat seama că poți face asta cu dbDelta()! +1

shea shea
8 ian. 2013 11:47:38

Așadar, am actualizat instrucțiunea SQL pentru a adăuga coloana de preț, dar am primit o eroare de bază de date care spune că tabelul există deja. Iată mesajul de eroră WordPress database error: [Table 'wp_booking_packages' already exists] CREATE TABLE wp_booking_packages( id mediumint(9) NOT NULL AUTO_INCREMENT, name text NOT NULL, description text NOT NULL, price decimal(14,2) NOT NULL, city1 text NOT NULL, city2 text NOT NULL, PRIMARY KEY (id) ) și am verificat în consola MySQL că coloana încă nu există.

mehulved mehulved
8 ian. 2013 11:53:03

Am actualizat răspunsul meu cu mai multe detalii. Dacă poți posta orice cod viitor folosind un gist, ca să-l pot vedea în întregime? Comentariile tind să distrugă formatarea și liniile noi, ceea ce ar putea face diferența între funcționare și nefuncționare a dbDelta aici

Tom J Nowell Tom J Nowell
8 ian. 2013 12:32:45

http://gist.github.com dacă nu știi de el

Tom J Nowell Tom J Nowell
8 ian. 2013 12:36:24

Iată un gist https://gist.github.com/4482802

mehulved mehulved
8 ian. 2013 12:39:27

@TomJNowell Ce se întâmplă dacă am un câmp în instrucțiunea mea de creare a tabelei cu tipul de date text, iar acum doresc să schimb tipul de date al acelui câmp în bigint, în acest caz dbDelta eșuează. Există vreo modalitate de a face acest lucru?

IAmDhar IAmDhar
6 apr. 2017 21:49:08

@IAmDhar cum aș converti cuvântul "banana" într-un număr? Aș pune această întrebare ca o întrebare nouă, este puțin probabil ca cineva să aibă răspunsul, și există o șansă mare ca acest lucru să depășească capacitățile dbDelta ( dbDelta va schimba coloana, dar nu va schimba datele în sine )

Tom J Nowell Tom J Nowell
6 apr. 2017 22:52:35

@mehulved problema aici ar putea fi la fel de simplă ca absența unui spațiu între numele tabelului și paranteza deschisă. dbDelta este extrem de sensibil la aceste lucruri, asigură-te că declarația SQL este bine formatată și curată, chiar dacă în SQL standard un spațiu nu este de obicei necesar etc., adaugă-l oricum

Tom J Nowell Tom J Nowell
6 apr. 2017 22:54:26

Mulțumesc pentru observație, că trebuie să existe un spațiu între numele tabelului și paranteza deschisă. Această informație tocmai mi-a rezolvat problema cu actualizarea tabelelor!

sebastian sebastian
5 mai 2019 19:13:19
Arată celelalte 6 comentarii
1

Pentru a adăuga o coloană într-o tabelă din baza de date WordPress, puteți utiliza $wpdb:

global $wpdb;

$table = $wpdb->prefix . 'my_table';
$sql = "ALTER TABLE `{$table}`
        ADD `new_column` VARCHAR(20) NULL DEFAULT NULL;";

$query_result = $wpdb->query( $sql );

$wpdb->query() returnează false dacă interogarea a eșuat, conform documentației metodei. Deci puteți scrie o structură if-else pentru a gestiona succesul sau eroarea:

if ( $query_result === false ){
    // a apărut o eroare
} else {
    // succes
}

Dacă trebuie să adăugați noua coloană după o anumită coloană, utilizați AFTER în interogare:

$sql = "ALTER TABLE `{$table}`
        ADD `new_column` VARCHAR(20) NULL DEFAULT NULL
        AFTER `exist_column`;";

De asemenea, puteți modifica

$sql = "ALTER TABLE `{$table}`
        MODIFY COLUMN `exist_column` VARCHAR(20) NULL DEFAULT NULL;";

sau șterge o coloană

$sql = "ALTER TABLE `{$table}`
        MODIFY COLUMN `exist_column`;";

Sfat mic: În PHP, în cadrul ghilimelelor duble ("), puteți folosi variabile în acolade ("foo {$var} bar") sau fără ele ("foo $var bar") pentru a insera variabile în șiruri de caractere, în loc de concatenare ("foo " . $var . " bar"). Am folosit acest lucru în codul de mai sus. Aflați mai multe despre parsarea șirurilor în php.

11 ian. 2021 18:04:04
Comentarii

poate răspunsul lui Tom este mai potrivit pentru subiect, acest răspuns este totuși util pentru unele scenarii. mulțumesc!

Dreanmer Dreanmer
31 iul. 2022 18:23:27