I have been trying to generate two tables in database on activation hook. But it generates only the first one table on activation hook . What am i doing wrong in my code?

class Datetimepicker_Tables{

function __construct(){


function activate(){

function create_tables(){
        global $wpdb;

        $date_table_name = $wpdb->prefix . 'booking_dates';
        $time_table_name = $wpdb->prefix . 'booking_timeslots';
        $charset_collate = $wpdb->get_charset_collate();

        $date_table = "CREATE TABLE $date_table_name (
            `id` int(11) NOT NULL AUTO_INCREMENT,
             `year` int(11) NOT NULL,
             `month` int(11) NOT NULL,
             `day` int(11) NOT NULL,
             PRIMARY KEY (`id`)
            ) $charset_collate;";

        $time_table = "CREATE TABLE $time_table_name (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `bid` int(11) NOT NULL,
            `time` int(11) NOT NULL,
            PRIMARY KEY (`id`),
            KEY `bid` (`bid`),
            CONSTRAINT `booking_timeslots_ibfk_1` FOREIGN KEY (`bid`) REFERENCES `booking_dates` (`id`)
            )  $charset_collate;";  

            require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
            dbDelta( $date_table );
            dbDelta( $time_table );

$tablesclass = new Datetimepicker_Tables();
  • REFERENCES booking_dates should be REFERENCES $date_table_name.
    – Sally CJ
    Mar 6 '19 at 12:23
  • Are you talking about this -> "$date_table_name = $wpdb->prefix . 'booking_dates';" ?
    – Afzal Khan
    Mar 6 '19 at 12:27
  • Yes, the table name.
    – Sally CJ
    Mar 6 '19 at 12:33
  • I don't think so, i made a variable and passing a name of the table in that variable.
    – Afzal Khan
    Mar 6 '19 at 12:39
  • I was saying that you didn't use the proper table name in the CONSTRAINT clause..
    – Sally CJ
    Mar 6 '19 at 13:00

You're not using the proper table name in your CONSTRAINT clause:

CONSTRAINT `booking_timeslots_ibfk_1` FOREIGN KEY (`bid`) REFERENCES `booking_dates` (`id`)

That should be:

CONSTRAINT `booking_timeslots_ibfk_1` FOREIGN KEY (`bid`) REFERENCES `$date_table_name` (`id`)

where $date_table_name (as I could see) is the correct table name.

  • 1
    To add to Sally's answer - the reference in the SQL for the table is "booking_dates" which lacks the database prefix defined in the variable $date_table_name, so the table "booking_dates" doesn't actually exist when the query is run.
    – butlerblog
    Mar 6 '19 at 13:06
  • You're welcome Afzal. And thank you @butlerblog. :)
    – Sally CJ
    Mar 6 '19 at 13:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.