2016-12-05 182 views
4

我有一个连接表叫carriers_rects,看起来像这样:mysql UPDATE说列不能为空。为什么它是空的?

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| carrier_id | int(11) unsigned | NO |  | NULL |    | 
| rect_id | int(11) unsigned | NO |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

我也有一个rects表看起来像这样:

+---------+-------------+------+-----+----------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+---------+-------------+------+-----+----------+----------------+ 
| id  | int(11)  | NO | PRI | NULL  | auto_increment | 
| name | varchar(54) | NO |  | new rect |    | 
| width | varchar(54) | NO |  | NULL  |    | 
| length | varchar(54) | NO |  | NULL  |    | 
| rounded | tinyint(1) | NO |  | NULL  |    | 
| xx  | varchar(54) | NO |  | NULL  |    | 
| yy  | varchar(54) | NO |  | NULL  |    | 
| height | varchar(54) | NO |  | NULL  |    | 
+---------+-------------+------+-----+----------+----------------+ 

我想一个case_id列添加到rects和只是使其成为one-to-many关系并杀死carriers_rects表。我们正在移动我们的数据库,我们从未使用过many-to-many关系。

所以我加入了case_idrects

alter table rects add case_id int(11) not null; 

然后我尝试了所有case_id的,将匹配来自carriers_rects表以更新rects的case_id

update rects set case_id = (select carrier_id from carriers_rects where rect_id = id); 

我得到column case_id cannot be null

我测试过,看看有没有空位,我似乎找不到任何。

select * from (select * from carriers_rects where rect_id IN(select id from rects)) `b` where id is null; 

我也尝试了另一种方式,因为老实说我有点困惑。

select id from rects where id IN(select rect_id from carriers_rects) 

显然我不是sql天才。但是很想在这里接受教育。 不知道为什么我得到上面提到的错误。

回答

2

此错误的主要原因是在你的内心查询条件rect_id = id。他们都从carriers_rects(这意味着carriers_rects.rect_id = carriers_rects.id),所以你得到null。将其更改为rect_id = rects.id

update rects set case_id = 
(select carrier_id from carriers_rects where rect_id = rects.id); 
+0

我在尝试时仍然遇到同样的错误。尽管这听起来很不错, – Johnston

+0

@Johnston这意味着你有'rects.id'不存在于'carriers_rects'表中。你可以使用@Rahul的JOIN语法,或者将条件添加到这个UPDATE中:'WHERE EXISTS(从carrier_rects中选择carrier_id,其中rect_id = rects.id)' – valex

+0

下面我的查询不会测试吗?这就是我的想法,所以我写了这些查询来测试它,它听起来并不像它有任何问题。 – Johnston

2

如果你更改为update-join语法,而不是使用子查询像

update rects r 
join carriers_rects cr on cr.rect_id = r.id 
set r.case_id = cr.carrier_id 
where cr.carrier_id is not null; 
+0

这是行不通的!我仍然不明白我为什么不工作。但我很高兴有一些工作。 – Johnston