限制mysql列的整数值

时间:2013-11-26 19:14:58

标签: mysql sql

我即将使用

创建一个表
CREATE TABLE clients
(
empno     INTEGER     NOT NULL DEFAULT 7654 
cname     VARCHAR(20) NOT NULL
);

现在,我希望empno值介于7000-8000之间。如果不是,它应该被拒绝。第一种方法是使用CHECK,当然MYSQL会忽略它。其次是创建一个具有可接受值的另一个表,并将其用作外部约束或类似的东西。创建具有1000个值的表非常不方便。必须有一个更简单的方法,但我不知道。

1 个答案:

答案 0 :(得分:1)

向表中添加INSERT / UPDATE触发器并拒绝任何值不在定义范围内的INSERTS。

编辑以包含示例

/*
-- ================================================
-- Template generated from Template Explorer using:
-- Create Trigger (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- See additional Create Trigger templates for more
-- examples of different Trigger statements.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name> 
   ON  <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name> 
   AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here

END
GO
*/

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[utg_ClientsInsert]
ON [dbo].[Clients]
AFTER INSERT,UPDATE
AS
BEGIN
    SET NO COUNT ON

    IF(SELECT COUNT(*) FROM INSERTED) = 0
     BEGIN
        RETURN -- do not execute trigger if no rows
     END

    IF(SELECT COUNT(*) FROM INSERTED WHERE empno NOT BETWEEN 7000 AND 8000) > 0
     BEGIN
        -- don't allow the insert to happen
        RAISERROR('Employee # must be between 7,000 and 8,000.', 18, 1)
     END

END

GO