【问题标题】:How do I INSERT into a database with a primary autoincrement key?如何使用主自动增量键插入数据库?
【发布时间】:2016-10-24 18:20:03
【问题描述】:

所以我有一个按照以下方式布置的表格:

CREATE TABLE `dealerships` (
  `dealership_id` BIGINT(20) UNSIGNED NOT NULL,
  `zone` CHAR(200) NULL DEFAULT NULL,
  `phone` BIGINT(20) UNSIGNED NOT NULL,
  `fax` BIGINT(20) UNSIGNED NOT NULL,
  `name` CHAR(200) NULL DEFAULT NULL,
  `address1` CHAR(200) NULL DEFAULT NULL,
  `address2` CHAR(200) NULL DEFAULT NULL',
  `servicephone` BIGINT(20) UNSIGNED NULL DEFAULT NULL,
  `timezone` CHAR(20) NULL DEFAULT NULL,
  PRIMARY KEY (`dealership_id`)
)
COMMENT='This stores dealership information. '
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

现在当我插入时

INSERT INTO dealerships (dealership_id, ~the rest~), VALUES( NULL, ~values);

这会返回一个错误,dealership_id 不能是 NULL 错误 1048。

INSERT INTO dealerships (dealership_id, ~the rest~), VALUES(0, ~values);

这会返回一个错误,即 dealership_id0 已经存在。

INSERT INTO dealerships (dealership_id, ~the rest~), VALUES(default, ~values);

这会返回一个错误,dealership_id 没有默认值错误 1364。

当我简单地说去死,并省略dealership_id

INSERT INTO dealerships (~the rest~), VALUES(~values);

我收到必须为 dealership_id 指定值的错误。

每次我都与autoincrement primary keys 合作。通常插入NULL 可以让索引为我做一些自动神奇的事情。发生了什么事??

平台特定信息:

MariaDB10.1.18 x64

Windows Server 2012 R2

【问题讨论】:

  • 您必须将列定义为自动递增。对于第一列,在NOT NULL 之后,您需要`AUTO_INCREMENT`。

标签: mysql mariadb auto-increment


【解决方案1】:

对于创建添加 AUTO_INCREMENT

CREATE TABLE `dealerships` (
  `dealership_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `zone` CHAR(200) NULL DEFAULT NULL,
  `phone` BIGINT(20) UNSIGNED NOT NULL,
  `fax` BIGINT(20) UNSIGNED NOT NULL,
  `name` CHAR(200) NULL DEFAULT NULL,
  `address1` CHAR(200) NULL DEFAULT NULL,
  `address2` CHAR(200) NULL DEFAULT NULL',
  `servicephone` BIGINT(20) UNSIGNED NULL DEFAULT NULL,
  `timezone` CHAR(20) NULL DEFAULT NULL,
  PRIMARY KEY (`dealership_id`)
)
COMMENT='This stores dealership information. '
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

并且对于插入不要插入密钥(通过自动增量自动创建)

insert into  `dealerships`  (

  `zone`,
  `phone`,
  `fax` ,
  `name`,
  `address1`,
  `address2`',
  `servicephone` ,
  `timezone`

  )  values (
      'vale_zone',
      1,
      2 ,
      'val_name',
      'val_address1',
      'val_address2',
      3 ,
    'val_timezone'
  )

【讨论】:

  • 见我的手术。当我省略键时,我收到错误 1364,dealership_id 没有默认值。
  • 但是您是否也将列设置为AUTO_INCREMENT
  • 为什么要投反对票?
【解决方案2】:

要插入具有自增属性的字段,请在创建表中使用ID int NOT NULL AUTO_INCREMENT

CREATE TABLE `dealerships` (
  `dealership_id` INT NOT NULL AUTO_INCREMENT,
  `zone` CHAR(200) NULL DEFAULT NULL,
  `phone` BIGINT(20) UNSIGNED NOT NULL,
  `fax` BIGINT(20) UNSIGNED NOT NULL,
  `name` CHAR(200) NULL DEFAULT NULL,
  `address1` CHAR(200) NULL DEFAULT NULL,
  `address2` CHAR(200) NULL DEFAULT NULL',
  `servicephone` BIGINT(20) UNSIGNED NULL DEFAULT NULL,
  `timezone` CHAR(20) NULL DEFAULT NULL,
  PRIMARY KEY (`dealership_id`)
)
COMMENT='This stores dealership information. '
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

之后,您有两种插入数据的解决方案。

解决方案 1

INSERT INTO dealerships(zone, phone, fax, name) VALUES('zone1', '00000', '00000', 'name1')

在这种情况下,我选择只在几列中添加数据(以 wame 方式添加其他列)。

解决方案 2

INSERT INTO dealerships SET zone = 'zone1', phone = '0000', name = 'Eddy'

在这里,我使用了SET field = value, field2 = value2 字段。

如您所见,我没有添加对 ID 的任何引用。正常,该字段为AUTO_INCREMENT模式,Mysql(或其他SGBD)会自动创建一个值。

当然,你可以强制取值:

INSERT INTO dealerships SET dealership_id = 10, zone = 'zone1', phone = '0000', name = 'Eddy'

INSERT INTO dealerships(dealership_id, zone, phone, fax, name) VALUES(9, 'zone1', '00000', '00000', 'name1')

http://www.w3schools.com/sql/sql_insert.asp

关于您的错误

  1. 正常。您指定了NOT NULL
  2. 正常,值 0 的记录已经存在(检查您的数据库)
  3. 正常。你不能使用default。这是一个有他自己的值的常数(1364)。
  4. 正常,字段好像不能省略 没有此问题的唯一方法是完全删除 ID 字段的引用。使用描述的解决方案:)

【讨论】:

    【解决方案3】:

    Georges 为您解释了这一切。如果要向表添加自动增量,只需运行此 sql 语句

    ALTER TABLE dealerships MODIFY COLUMN dealership_id BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;

    这将在dealership_id 列上添加自动增量属性。如果您想更改自动增量起始值,请运行此(将 100 更改为您的起始值)

    ALTER TABLE dealerships AUTO_INCREMENT=100;

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2017-08-12
      • 2012-02-22
      相关资源
      最近更新 更多