Modaresi
Modaresi

Reputation: 233

Limit integer value for mysql's column

I am about to create a table using

CREATE TABLE clients
(
empno     INTEGER     NOT NULL DEFAULT 7654 
cname     VARCHAR(20) NOT NULL
);

Now, I want the empno value to be between 7000-8000. If not it should be rejected. First method is to use CHECK which of course MYSQL is going to ignore. Second is to create a another table with acceptable values and use it as a foreign constraint or something like that. Creating a table with 1000 values is very inconvenient. There must be an easier way but I have no idea.

Upvotes: 2

Views: 3561

Answers (1)

tecshack
tecshack

Reputation: 108

Add an INSERT/UPDATE trigger to the table and reject any INSERTS where the value is not in the defined range.

edited to include an example

/*
-- ================================================
-- 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

Upvotes: 1

Related Questions