Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有动态值的MySql条件插入_Mysql_Sql - Fatal编程技术网

具有动态值的MySql条件插入

具有动态值的MySql条件插入,mysql,sql,Mysql,Sql,在我解释我的问题之前,这里有几个简化的表定义来帮助说明我的问题: -- Holds data about different memberships CREATE TABLE IF NOT EXISTS `Member_Types` ( `ID` INT UNSIGNED NOT NULL AUTO_INCREMENT, `Name` VARCHAR(20) NOT NULL, `Description` VARCHAR(255) NOT NULL, `Member_Limit` TI

在我解释我的问题之前,这里有几个简化的表定义来帮助说明我的问题:

-- Holds data about different memberships
CREATE TABLE IF NOT EXISTS `Member_Types` ( 
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`Name` VARCHAR(20) NOT NULL,  
`Description` VARCHAR(255) NOT NULL, 
`Member_Limit` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0', 
PRIMARY KEY( `ID` )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `Member_Types` ( `ID`, `Name`, `Description`, `Member_Limit` ) VALUES 
( 1, 'General Member', 'Description of this membership.', 00 ), 
( 2, 'Extended Member', 'Description of this membership.', 00 ), 
( 3, 'Premium Member', 'Description of this membership.', 00), 
( 4, 'General Administrator', 'Description of this membership.', 05 ), 
( 5, 'Master Administrator', 'Description of this membership.', 01 );

-- Stores the basic data about our site members
CREATE TABLE IF NOT EXISTS `Member_Infos` ( 
`ID` BIGINT(8) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, 
`Username` VARCHAR(30) NOT NULL UNIQUE, 
`Password` CHAR(41) NOT NULL, 
`EmailAddr` VARCHAR(100) NOT NULL, 
`Type_ID` INT UNSIGNED NOT NULL, 
`Salt_ID` BIGINT(8) UNSIGNED ZEROFILL NOT NULL, 
PRIMARY KEY( `ID` ), 
FOREIGN KEY( `Type_ID` ) REFERENCES `Member_Types` ( `ID` )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Member\u Infos表包含绑定Member\u Infos.Type\u ID=Member\u Types.ID的外键

Member_Types表有一个列Member_Limit,其中包含一个整数,该整数表示Member_表提供的最大记录数 可以包含其Type_ID等于Member_Types.ID的位置

我能够编写一个检查约束,但mysql显然没有实施检查约束。
我想编写一个触发器来检查member_infos表中的记录计数是否,而不是编写一个触发器,您可以编写自己的普通查询来检查insert之前的约束。尝试:

INSERT INTO member_infos
SELECT      1, 'Timothy', 'secret', 'me@myself.com', 5, 0
FROM        dual
WHERE       (SELECT COUNT(*) FROM member_infos WHERE Type_ID = 5) 
            < 
            (SELECT Member_Limit FROM member_types WHERE ID = 5)

我曾经检查过类型_ID=5的情况。如果不满足计数标准,则此选项将忽略,并且仅当类型id=5的成员信息中的条目成员计数小于成员类型表中设置的限制时才会插入。若要引发错误,请在触发器中使用SIGNAL语句


在MySQL中,触发器可能是在数据库级别执行此操作的正确方法

但是,通常认为应该在应用程序层而不是数据库中执行这种业务规则。业务规则有变化的习惯,修改应用程序层通常比修改数据库更容易。为应用层代码编写单元测试也更容易,调试应用层通常也更容易

您可以尝试添加以下insert语句

INSERT INTO `member_infos` (`ID`, `Username`, `Password`, `EmailAddr`, `Type_ID`,
 `Salt_ID`) VALUES (2, 'ewsew', 'ew', 'ewq', 2, 2);
在整个代码的末尾。您将不被允许进行此插入,因为类型\u id=2允许为成员\u IFO插入0条记录。同样,在插入五个REOCRD后,您将在插入时收到类型为_id=5的错误

我添加了一个触发器,因为您需要对每个新条目进行验证,而不是一些静态值。因此,dual可以像某些问题一样工作,这不是同一个问题,因为您需要新的.type_id,它仅在触发器中可用

下面是完整的代码


注意:有些人可能会改进/删除“字段列表”中的错误消息1054-未知列“此类型超出的成员限制”。此异常是必需的,因为它会阻止在询问者的所需条件下插入。但我们将赞赏改进。我没办法解决。

我想说触发的想法可能是最好的。非常感谢您的提问。希望答案也是:注意:有些人可能会改进/删除“字段列表”中的错误消息1054-未知列“此类型超出的成员限制”,请。。。事实上,引发错误的正确方法是使用SIGNAL语句,正如在另一个答案中已经发布的那样。在我看来,这篇文章提供了更多的细节,包括实用代码和小提琴演示,很棒,但没有解决根本问题。这是我一个多小时的努力。信号可能抛出错误,但根本无法解决根本问题。我的解决方案需要从错误消息中删除前3个单词。它给出了100%的问题答案。顺便说一下,请用信号机提供解决方案。。如果你有信心否决我的答案。这不是一个完美的解决方案,但只差三个字。如果我在“字段列表”中以“此类型的成员限制已超出”的形式收到错误消息,我认为答案是正确的。尽管改进这个错误可能需要做更多的工作
CREATE TABLE IF NOT EXISTS `member_infos` (
  `ID` bigint(8) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `Username` varchar(30) NOT NULL,
  `Password` char(41) NOT NULL,
  `EmailAddr` varchar(100) NOT NULL,
  `Type_ID` int(10) unsigned NOT NULL,
  `Salt_ID` bigint(8) unsigned zerofill NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `Username` (`Username`),
  KEY `Type_ID` (`Type_ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

-- Triggers `member_infos`

DROP TRIGGER IF EXISTS `validate_Member_infos_insert`;
DELIMITER //
CREATE TRIGGER `validate_Member_infos_insert` BEFORE INSERT ON `member_infos`
 FOR EACH ROW begin
declare lim int;declare cnt int;
select member_limit into lim from member_types where id=new.Type_id;
select count(*) into cnt from Member_Infos where type_id=new.Type_id;
if cnt>=lim
then
select `Member Limit exeeded for this type` into lim from member_infos;
end if;
end
//
DELIMITER ;

CREATE TABLE IF NOT EXISTS `member_types` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) NOT NULL,
  `Description` varchar(255) NOT NULL,
  `Member_Limit` tinyint(2) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `member_types` (`ID`, `Name`, `Description`, `Member_Limit`)
VALUES (1, 'General Member', 'Description of this membership.', 0),
(2, 'Extended Member', 'Description of this membership.', 0),
(3, 'Premium Member', 'Description of this membership.', 0),
(4, 'General Administrato', 'Description of this membership.', 5),
(5, 'Master Administrator', 'Description of this membership.', 1);

INSERT INTO `member_infos` (`ID`, `Username`, `Password`, `EmailAddr`,
`Type_ID`, `Salt_ID`) VALUES (1, 'ewsew', 'ew', 'ewq', 5, 2);