【问题标题】:Why can't I -- or how do I -- insert NULL values into my MySQL database using the WordPress API为什么我不能 - 或者我如何 - 使用 WordPress API 将 NULL 值插入我的 MySQL 数据库
【发布时间】:2015-11-19 18:19:35
【问题描述】:

我已经为此工作了好几个小时,但不知道如何为列插入/更新 NULL 值。比如我有一段代码

    case 'add':
    {
        $message = $wpdb->insert('projs', array('compname' => $compname, 'projname' => $projname, 'imageurl' => $imageurl, 'sumsmall' => $sumsmall, 'sumfull' => $sumfull, 'results' => $results, 'caseid' => $caseid, 'hide' => $hide)) 
                    ? 'Successfully added project to the database.'
                    : 'Error occurred when trying to add project to database: ' . $wpdb->last_error;
        break;
    }

每当它在$caseid等于null(在PHP领域)执行时,查询就会失败,wpdb->last_error

无法添加或更新子行:外键约束失败 ('my_table_name', 'projs', 约束 'projs_ibfk_1' 外键 ('caseid') REFERENCES 'cases' ('id') ON DELETE SET NULL

作为参考,表格 projs 和 case 是在安装过程中创建的

// Add table to hold the project portfolio
if ($wpdb->get_var("SHOW TABLES LIKE 'projs'") != 'projs')
{
    $wpdb->query("CREATE TABLE projs (id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY, compname VARCHAR (200), projname VARCHAR (200), imageurl VARCHAR(300), sumsmall VARCHAR (250), sumfull VARCHAR (5000), results VARCHAR (5000), postdate DATETIME DEFAULT CURRENT_TIMESTAMP, caseid MEDIUM INT, FOREIGN KEY (caseid) REFERENCES cases(id) ON DELETE SET NULL) $charset_collate");
}
// Add table to hold the case studies
if ($wpdb->get_var("SHOW TABLES LIKE 'cases'") != 'cases')
{
    $wpdb->query("CREATE TABLE cases (id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY, compname VARCHAR (200), casename VARCHAR (200), imageurl VARCHAR(300), summary VARCHAR (5000), results VARCHAR (5000), postdate DATETIME DEFAULT CURRENT_TIMESTAMP) $charset_collate");
}

而且我看不出在projs 中插入NULL 值对caseid 有何违反。

【问题讨论】:

    标签: php mysql wordpress database-design


    【解决方案1】:

    MySQL 的 CURRENT_TIMESTAMP 函数期望在 TIMESTAMP 数据类型上调用,而不是 DATETIME

    请注意,如果表是 InnoDB,ON DELETE SET NULL 将导致问题

    CREATE TABLE projs (
    id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    compname VARCHAR (200), 
    projname VARCHAR (200), 
    imageurl VARCHAR(300), 
    sumsmall VARCHAR (250), 
    sumfull VARCHAR (5000), 
    results VARCHAR (5000), 
    postdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    caseid MEDIUMINT, 
    FOREIGN KEY (caseid) REFERENCES cases(id) ON DELETE SET NULL
    );
    

    【讨论】:

    • 那么您的评论是指您认为是我的问题的根源,还是一个单独的问题?
    【解决方案2】:

    这并不是说它通常不允许您插入 NULL 值。就是它特别不允许您将NULL 值插入caseid

    由于将caseid 链接到cases 中的id 列的外键约束,它需要一个等于ids 之一的值。

    您应该可以轻松地将 NULL 值插入任何其他列(当然,id 除外。)

    【讨论】:

    • 所以外键不能为空?如果我希望表中的列可能但不一定与另一个表中的列相关联怎么办?对于我的应用程序,projs 的某些行与cases 的行相关联,但不一定是。
    • 我相信您可以通过在创建时将该列显式定义为可为空来允许在外键中使用空值。 (即caseid MEDIUM INT NULL
    • 这是一个很好的问答:stackoverflow.com/questions/2366854/…
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2016-09-09
    相关资源
    最近更新 更多