2つのテーブルに挿入するInsertストアドプロシージャがあります。最初のテーブルのLast_Insert_IDを使用する2番目のテーブル。これが私のsprocです:
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `new_user_create`(
IN oFarmName varchar(45),
IN oFirstName varchar(45),
IN oAddress1 varchar(45),
IN oCity varchar(45),
IN oState varchar(45),
IN oZip varchar(45),
IN oCountry varchar(45)
)
BEGIN
insert into intelliair.individual
( FarmName, FirstName)
values ( oFarmName, oFirstName);
insert into intelliair.address
(IndividualID, Address1, City, State, Zip, Country)
Values (Last_Insert_ID(), oAddress1, oCity, oState, oZip, oCountry);
END
MySqlワークベンチでクエリをテストする方法は次のとおりです。
call new_user_create(@myFarm, @MyName, @MyAddress, @MyCity, @MyState, @MyZip, @MyCountry)
「列Address1をnullにすることはできません」というエラーが表示されます
どこに行くの? sprocにありますか?それとも私がそれを呼んでいる方法ですか?
「ColumnAddress1をnullにすることはできません」は、intelliair.address.Address1
フィールドをnot null
で定義する必要があることを示します。
また、ストアドプロシージャに渡す前に、@MyAddress
の値を事前に定義しているとは思いません。
定義されていない限り、NULL
として扱われるため、エラーがスローされます。
次のようなストアドプロシージャを呼び出す前に、値をクロスチェックするには:
select @MyAddress; -- ,@myFarm, @MyName, @MyCity, @MyState, @MyZip, @MyCountry;
アップデート1:
各パラメータの値を直接入力することにより、ストアドプロシージャを呼び出すことができます。
例:
call new_user_create(
'my Farm value', -- @myFarm
'E B', -- @MyName
'My Address is SO', -- @MyAddress1
'My City is Coders', -- @MyCity
'CA', -- @MyState
'12345', -- @MyZip
'US' -- @MyCountry
);
例外は、INSERT(またはUPDATE)ステートメントによってスローされます。つまり、Address1
として宣言されているNOT NULL
という名前の列にNULL値が割り当てられます。
あなたが示していることから、最も可能性の高い説明は、oAddress1パラメーターとして渡された値がNULLであり、例外が2番目のINSERTステートメントによってスローされていることです。
したがって、最も可能性の高い説明は、プロシージャの呼び出しが行われたときに、@MyAddress
ユーザー変数に値が割り当てられていないことです。
(intelliair.individualテーブルにAddress1
列がないこと、またはある場合はNOT NULL
として定義されていないことを確認できます。)
(例外をスローしているのはステートメントの1つではなく、BEFORE INSERT FOR EACH ROWトリガーのINSERTステートメントのような再帰SQLステートメントである可能性もあります。)
USE lportal;
DELIMITER $$
CREATE PROCEDURE `iemp`(IN eid INT(11),IN ename varchar(15),IN dname varchar(15),IN doj DATE)
BEGIN
INSERT INTO e_emp (eid,ename,dname,doj) VALUES (eid,ename,dname,doj);
END