我有这样构建的表,它为每个用户分配一个独特的articleId从零开始。
CREATE TABLE `articles` (
`artcId` INT(10) NOT NULL AUTO_INCREMENT,
`artcUserId` INT(10) NOT NULL DEFAULT '0',
`artcStackId` INT(10) NOT NULL DEFAULT '0',
`artcTitle` VARCHAR(200) NULL DEFAULT NULL,
PRIMARY KEY (`artcUserId`, `artcId`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
还有一部分为每篇文章分配一个正在运行的序列号(artcStackId)。你会在代码中看到。
事情是,是否可以根据用户的国家/地区分配artcStackId?该国家/地区代码将来自php。
例如:如果它是美国然后从10001 + 1开始,如果它的英国从20001 + 1开始,如果它的CA然后从30001 + 1开始并且在&上。
是否可以这样做?
我当前的SQL查询如下:
insert into articles (artcUserId, artcStackId, artcCountry, artcTitle)
select 4,IFNULL((MAX(artcStackId)+1) ,0),'US','Hello World'
FROM articles;
但是我想要它的方式它必须像(这只是一个例子sql):
insert into articles (artcUserId, artcStackId, artcCountry, artcTitle)
select 4, IF artcCountry = 'US' then (selct MAX(artcStackId)+1
where artcCountry = 'US'),
'US','Hello World'
FROM articles;
我希望你明白这一点。
答案 0 :(得分:1)
我建议你使用TRIGGER:
CREATE TRIGGER ins_articles
BEFORE INSERT ON articles
FOR EACH ROW
SET new.artcStackId=coalesce(
(select max(artcStackId)
from articles
where artcCountry = new.artcCountry)+1,1)
;
或类似的东西:
CREATE TRIGGER ins_articles
BEFORE INSERT ON articles
FOR EACH ROW
SET new.artcStackId=coalesce(
(select max(artcStackId)
from articles
where artcCountry = new.artcCountry)+1,
case when new.artcCountry = 'US' then 10001
when new.artcCountry = 'UK' then 20001
when new.artcCountry = 'CA' then 30001
end)
;
see it working here。然后您可以插入而不指定列artcStackId,因为它将自动计算。
答案 1 :(得分:0)
从技术上讲,这会有效,但在重负载期间,您可能会遇到artcStackId
重复值的问题。它的效率也不太高。
INSERT INTO articles (artcUserId,artcStackId,artcCountry,artcTitle)
SELECT 4,MAX(artcStackId)+1,'US','Hello World'
FROM articles
WHERE artcCountry = 'US' LIMIT 1
此外,这假设文章表已经为该国家/地区至少有一行。
更好的选择可能是拥有country
表,其中包含nextStackId
值。在事务中,更新该表中的下一个堆栈ID,选择更新的值,将其用于插入,然后提交事务。这应该更安全。
答案 2 :(得分:0)
如果您创建一个名为Cities的新表,将idCity和numberBeg作为字段,并且您将知道从哪个数字开始计算
,会发生什么?