【问题标题】:How do I add a constraint to this code where only certain characters can be inputted?如何在只能输入某些字符的代码中添加约束?
【发布时间】:2020-06-21 20:40:32
【问题描述】:

完整的 mysql 新手,但我在网上查找解释我的问题的资源时遇到问题。本质上,我需要向 videoCode 行添加一个约束,其中标识符是 XX## 形式的代码 其中 X 是字母,# 是数字。

任何帮助将不胜感激。

CREATE TABLE videoTable(
    videoID INT,
    channelID INT,
    videoTitle VARCHAR(255) NOT NULL,
    videoPostedDate DATE NOT NULL,
    videoTags VARCHAR(255),
    noViews INT NOT NULL,
    videoCode VARCHAR(4) NOT NULL (ADD CONSTRAINT)

    PRIMARY KEY (videoID),
    FOREIGN KEY (channelID) REFERENCES channelTable(channelID)
);

【问题讨论】:

  • 您使用的是什么版本的 MySQL? Edit问题并添加标签。

标签: mysql sql oracle create-table check-constraints


【解决方案1】:

使用CHECK constraint

CREATE TABLE videoTable(
    videoID INT,
    channelID INT,
    videoTitle VARCHAR(255) NOT NULL,
    videoPostedDate DATE NOT NULL,
    videoTags VARCHAR(255),
    noViews INT NOT NULL,
    videoCode VARCHAR(4) NOT NULL CHECK(videoCode REGEXP '^[A-Za-z]{2}[0-9]+$')
    PRIMARY KEY (videoID),
    FOREIGN KEY (channelID) REFERENCES channelTable(channelID)
);

正则表达式描述了一个由 2 个字母字符组成的字符串,后跟仅数字(必须至少有一个数字)。

注意:这需要 MySQL 8.0。在早期版本中,检查约束被解析但被忽略,您通常需要一个触发器。

【讨论】:

  • 只是出于好奇,如果不检查它们,解析它们的目的是什么?当它们不做任何事情时允许它们成为有效的语法似乎很奇怪。
  • @MaxYoung:我同意,这是一个棘手的行为。我想他们是这样说的,因为早期版本已经预见到了这个新功能。但在我看来,这不是一个好的 API 设计选择。
  • @RossKnight 。 . .这在很大程度上取决于版本。我认为直到 8.0.16 才支持这一点,这是最近的(而不仅仅是 8.0)。这就是指定版本如此重要的原因。
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2017-12-07
相关资源
最近更新 更多