插入时出现Mysql完整性错误1452

时间:2016-08-05 17:29:40

标签: mysql django

select * from memory_games_game;给了我下面的表格:

enter image description here

select * from memory_games_game_state;给了我下面的表格:

enter image description here

我有一个存储过程如下:

delimiter //
CREATE PROCEDURE get_game_by_user_id(  
     p_user_id int, p_game_id int  
)   
BEGIN  
    insert into memory_games_game_state(user_id, game_id, level, progress) 

    SELECT 24 as user_id,
        game.game_type as game_id,
        1 as level,
        0 as progress

    FROM memory_games_game game 
    left outer join memory_games_game_state gameState on 
        game.game_type=gameState.game_id  and
        gameState.user_id=24 
    where game.level=1 and gameState.user_id is null;

    if p_game_id = -1 then
        SELECT  gameState.level, game_type, `current_date`    
        FROM memory_games_game game join memory_games_game_state gameState on 
             game.game_type=gameState.game_id and 
             gameState.user_id=24 and
             game.level=gameState.level;
    else
    SELECT gameState.level, game_type, `current_date`   
    FROM memory_games_game game join memory_games_game_state gameState on 
        game.game_type=gameState.game_id and 
        gameState.user_id=p_user_id and
        game.level=gameState.level
        WHERE game_type=12;

    end if;
END
// 

第一个插入将记录插入memory_games_game_state表。

此插入对于game_id从8到11是成功的,但是对于12以及以下错误失败:

enter image description here

我可以在表memory_games_game中为 game_type 12插入记录,这只是另一张表中的game_id,即memory_games_game_state

出了什么问题?

更新

我的django模特:

class Game(models.Model):

    #Field for storing game type
    GAME_TYPE_CHOICES = (
        (8, 'Simon Game'),
        (9, 'Pinpoint reaction'),
        (10, 'Loslassen'),
        (11, 'Word pair'),
        (12, 'Wortschatz')
    )
    game_type = models.IntegerField(choices=GAME_TYPE_CHOICES)   
    level = models.IntegerField(default='1')
    #This helps to print in admin interface
    def __str__(self):
        return u"%s  level %s" % (self.get_game_type_display(), self.level)



class Game_state(models.Model):
    game = models.ForeignKey(Game, blank=True, null=True)
    user = models.ForeignKey(User, blank=True, null=True)
    level = models.IntegerField(default='1')
    progress = models.IntegerField(default='0')
    current_date = models.DateField(auto_now=True)

class Game_state_ui_model(models.Model):
    GAME_TYPE_CHOICES = (
        (8, 'Simon Game'),
        (9, 'Pinpoint reaction'),
        (10, 'Loslassen'),
        (11, 'Word pair'),
        (12, 'Wortschatz')
        )
    game_type = models.IntegerField(choices=GAME_TYPE_CHOICES)
    level = models.IntegerField()
    user_id = models.IntegerField(default='0')
    current_date = models.DateField(auto_now=True)

    # static method to fetch games for a paricular user  
    @staticmethod  
    def fetch_games(user_id, game_id):
        print("Fetching games in model")

        # create a cursor  
        cur = connection.cursor()  
        # execute the stored procedure passing in   
        # search_string as a parameter  
        cur.callproc('get_game_by_user_id', [user_id, game_id,])  
        # grab the results  
        results = cur.fetchall()

        cur.close()  

        Game_state_list=[] 

        for row in results:
            print("Get game", row)
            Gs = Game_state_ui_model()

            Gs.level=row[0]
            Gs.game_type=row[1]
            Gs.current_date=row[2]


            Game_state_list.append(Gs)

        return Game_state_list

2 个答案:

答案 0 :(得分:0)

如错误所述,game_id引用memory_games_game.id; NOT memory_games_game.game_type。

认为“game_type 12只是另一个表中的game_id,即memory_games_game_state”是不正确的。

你需要在memory_games_game中输入一行,id = 12。

答案 1 :(得分:0)

我删除了所有表并再次进行迁移,这在某种程度上解决了问题。我没有改变任何其他东西。