【问题标题】:MySQL default values not working as expectedMySQL 默认值未按预期工作
【发布时间】:2014-08-20 17:57:00
【问题描述】:

来自 SO 的朋友们好!

这段代码以前可以工作,但是当我克隆数据库时它似乎停止工作。有一个名为 maps 的表,它有一些默认值,例如最大值。据我了解,如果我的 INSERT 代码没有值,那么将使用默认值。

这就是我正在做的:

这些值可能存在,也可能不存在。

$scan->maximo_exploracion   = addslashes($_GET['scan_maximo_exploracion']);
$scan->proceso_analisis = addslashes($_GET['scan_proceso_analisis']);
$scan->email_user           = addslashes($_GET['scan_email_user']);
$scan->email_owner          = addslashes($_GET['scan_email_owner']);

那么:

db_ask($db_resonance_slave, "
INSERT INTO mapas
SET
usuario_id              = '$user->id',
maximo_exploracion      = '$scan->maximo_exploracion',
proceso_analisis        = '$scan->proceso_analisis',
email_user              = '$scan->email_user',
email_owner             = '$scan->email_owner',
max_proc                = '5',
proceso_exploracion     = 'esperando',
direccion               = '$scan->address',
dominio                 = '$scan->dominio',
dominio_id              = '$dominio->id',
server_address          = '$scan->server_address',
server_zone             = '$scan->zone_name',
server_zone_code        = '$scan->zone_code',
server_response_speed   = '$scan->server_response_speed'
");

现在,几天前,同样的代码,如果$scan->maximo_exploracion没有任何信息,就会插入记录,默认值为100。 p>

此时,它显示为空白。这当然会导致问题。

有什么想法吗?

谢谢! 克里斯;


桌子:

CREATE TABLE `mapas` (
`id` INT(12) NOT NULL AUTO_INCREMENT,
`usuario_id` VARCHAR(256) NOT NULL,
`maximo_exploracion` VARCHAR(256) NOT NULL DEFAULT '100',
`max_proc` VARCHAR(256) NOT NULL,
`open_proc` VARCHAR(256) NOT NULL,
`hora_lanzado` VARCHAR(256) NOT NULL,
`direccion` VARCHAR(256) NOT NULL,
`dominio` VARCHAR(256) NOT NULL,
`dominio_id` VARCHAR(256) NOT NULL,
`idioma` VARCHAR(256) NOT NULL,
`server_address` VARCHAR(256) NOT NULL,
`server_zone` VARCHAR(256) NOT NULL,
`server_zone_code` VARCHAR(256) NOT NULL,
`server_response_speed` VARCHAR(256) NOT NULL,
`proceso_exploracion` VARCHAR(256) NOT NULL DEFAULT 'esperando',
`proceso_analisis` VARCHAR(256) NOT NULL DEFAULT 'esperando',
`email_owner` VARCHAR(256) NOT NULL DEFAULT 'False',
`email_user` VARCHAR(256) NOT NULL DEFAULT 'True',
`eliminado` INT(12) NOT NULL DEFAULT '0',
`creacion` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)

COMMENT='Almacena mapas, los mapas son ordenes de exploración y análisis para un dominio específico.' 整理='latin1_swedish_ci' 引擎=InnoDB;

【问题讨论】:

  • 如果你改变的只是数据库端,为什么不发布所有关于数据库端的信息?
  • fancyPants 先生/小姐,这绝对是合乎逻辑的,这就是我刚才所做的。
  • 这是来自克隆数据库还是原始数据库?只是为了确定......
  • 出乎我的意料,我删除了原来的那个。这是来自克隆的数据库。这是一个网络爬虫的片段,因为它太大了,我划分了数据库,创建了一个主/从方案。但是,现在正在做这种行为......
  • 我怀疑您的脚本将 maximo_exploracion 设置为空白而不是 NULL。由于空白不为空,它没有插入默认值。

标签: php mysql insert default-value


【解决方案1】:

也许: http://www.noelherrick.com/blog/mysql-quirk-not-null-defaults

它表示使用扩展插入(您在插入语句中指定多行),您可以绕过此默认值;提供警告而不是错误。然而,单个插入语句会引发错误。

目前可以避免这种情况

Set sql_mode = "strict_all_tables"; 

然后使用 default 关键字,它将插入该列的默认值。

【讨论】:

【解决方案2】:

正如 cmets 中所建议的,您传递的是空白而不是 NULL。试试这个:

if (isset($_GET['scan_maximo_exploracion']) && $_GET['scan_maximo_exploracion']) {
    $scan->maximo_exploracion   = addslashes($_GET['scan_maximo_exploracion']);
}

【讨论】:

  • 感谢您的帮助 Oli,我不确定,但由于 $_GET['scan_maximo_exploracion'] 根本没有分配,因此表示 $scan->maximo_exploracion 应该为空,而不是空。
  • 我想保留 PHP 的原样,因为我知道它的功能......或者,它曾经是。但是,像您这样的方法可能是 -- if ($scan->maximo_exploracion == '') { unset($scan->maximo_exploracion); }
  • addslashes() 将返回一个字符串,而不管现在 $_GET 的内容如何。
  • Addslashes() 已删除 - (儿童:在开发环境中仅用于测试建议)并且它的行为仍然相同,变量是 100% 明确的,并且 MySQL 的行为不符合预期。跨度>
  • 当您从 db_ask() 中删除“maximo_exploracion = '$scan->maximo_exploracion'”时会发生什么?
猜你喜欢
  • 2010-12-30
  • 2016-07-01
  • 2019-01-06
  • 2014-05-19
  • 1970-01-01
  • 2021-04-06
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多