[wp-trac] [WordPress Trac] #46452: dbDelta given the same PRIMARY KEY and normal KEY produces no error, reports table created successfully, but the table is not created
WordPress Trac
noreply at wordpress.org
Sat Mar 9 00:07:34 UTC 2019
#46452: dbDelta given the same PRIMARY KEY and normal KEY produces no error,
reports table created successfully, but the table is not created
--------------------------+-----------------------------
Reporter: radgh | Owner: (none)
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Database | Version: 5.1
Severity: trivial | Keywords:
Focuses: |
--------------------------+-----------------------------
I spent about 45 minutes trying to find out why one of several dbDelta
functions was not creating a table. It wasn't giving a warning, and in
fact was saying "Created table wp_dtl_exam_resultmeta". But the table was
not created.
I eventually found the problem which was that I had a key called "meta_id"
and "answer_id" and simply had put the wrong primary key, which should
have been meta_id. But I had:
PRIMARY KEY (answer_id),
KEY answer_id (answer_id)
This gives a success message without creating a table - which doesn't seem
right. Of course this isn't a problem with WordPress, it is a problem with
my code. But it seems a check is missing from dbDelta, which is what I
want to report.
Here is the full code to reproduce the problem, just put it in a plugin or
functions.php:
{{{#!php
<?php
if ( !defined( 'ABSPATH' ) ) exit;
/**
* Creates/updates custom database tables for the plugin:
* -> wp_dtl_exam_results
* -> wp_dtl_exam_resultmeta
*/
function example_database_creation_for_wordpress_trac() {
global $wpdb;
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'dtl_exam_resultmeta';
// MY ERROR IS: PRIMARY KEY (answer_id),
// IT SHOULD BE: PRIMARY KEY (meta_id),
// But the dbDelta function doesn't notice that, and says it created a
table when it didn't.
$sql = <<<MYSQL
CREATE TABLE $table_name (
meta_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
answer_id BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
meta_key VARCHAR(255) NULL DEFAULT NULL,
meta_value LONGTEXT NULL,
PRIMARY KEY (answer_id),
KEY answer_id (answer_id),
KEY meta_key (meta_key)
) $charset_collate;
MYSQL;
$result = dbDelta( $sql );
// Debug this:
echo '<pre>';
echo 'The table creation SQL:' . "\n\n";
echo $sql;
echo "\n -- \n";
// This should give some warning or at least say table creation
failed. It doesn't. It says the table was created.
echo 'dbDelta results: ' . "\n\n";
if ( $result ) foreach( $result as $m ) echo $m . "\n";
else echo '(no results from dbDelta)';
echo "\n -- \n";
// This should show the table name by checking information_schema, but
it's an empty array
echo 'Table query from INFORMATION_SCHEMA, this should show the table
name: ' . "\n\n";
$table_exists = $wpdb->get_results( "SELECT TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '". DB_NAME ."' AND
TABLE_NAME = '". $table_name ."';" );
var_dump( $table_exists );
echo '</pre>';
exit;
}
example_database_creation_for_wordpress_trac();
}}}
--
Ticket URL: <https://core.trac.wordpress.org/ticket/46452>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list