반응형
MySQL While Loop을 통해 테이블을 증분값으로 채웁니다(Auto-Increment는 옵션 없음).
현재 MySQL 테이블을 증분 값으로 채우려는 시도입니다.나중에 AUTO-INCREMENT가 해결책이 되지 않는 이유를 변경할 수 있습니다.phpMyAdmin의 SWL 콘솔에서 작업하고 있습니다.
settingsOperationMixerId만 AUTO-INCREMENT가 네이블입니다.
루프를 시도했습니다.
DELIMITER ;
CREATE PROCEDURE fill()
BEGIN
DECLARE v1 INT DEFAULT 1;
DECLARE b INT DEFAULT 1; #counting upwards
DECLARE c INT DEFAULT 1; #only 1 mixer
DECLARE d INT DEFAULT 1; #product from 1-6
WHILE v1 < 64 DO
INSERT INTO `settingsoperationmixer`(`settingsOperationMixerId`,
`settingsOperationId`, `mixerId`, `productId`) VALUES (NULL,b,c,d);
IF d < 6 THEN SET d = d + 1;
ELSE SET d = 1;
END IF;
SET b = b + 1;
SET v1 = v1 + 1;
END WHILE;
END;
DELIMITER ;
settingsOperationId는 1-63 증분이고 productId는 1-6에서 다시 1로 시작하는 동안 이 작업은 63회 반복됩니다.
다음 오류 메시지가 나타납니다.
Error
SQL query:
CREATE PROCEDURE fill()
BEGIN
DECLARE v1 INT DEFAULT 1
MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to
your MariaDB server version for the right syntax to use near '' at line 3
문제 해결에 도움이 되는 내 테이블의 SQL-CODE:
-- phpMyAdmin SQL Dump
-- version 4.7.7
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Mar 30, 2018 at 05:13 PM
-- Server version: 10.1.30-MariaDB
-- PHP Version: 7.2.2
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `scm`
--
-- --------------------------------------------------------
--
-- Table structure for table `settingsoperationmixer`
--
CREATE TABLE `settingsoperationmixer` (
`settingsOperationMixerId` int(11) NOT NULL,
`settingsOperationId` int(11) NOT NULL,
`mixerId` int(11) NOT NULL,
`productId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `settingsoperationmixer`
--
ALTER TABLE `settingsoperationmixer`
ADD PRIMARY KEY (`settingsOperationMixerId`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `settingsoperationmixer`
--
ALTER TABLE `settingsoperationmixer`
MODIFY `settingsOperationMixerId` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
수정 포함
drop procedure if exists p;
delimiter $$
CREATE PROCEDURE p()
BEGIN DECLARE v1 INT DEFAULT 1;
DECLARE a INT DEFAULT 1; #autoIncrement
DECLARE b INT DEFAULT 1; #counting upwards
DECLARE c INT DEFAULT 1; #only 1 mixer
DECLARE d INT DEFAULT 1; #product from 1-6
WHILE v1 < 64 DO
INSERT INTO `settingsoperationmixer`(`settingsOperationMixerId`,`settingsOperationId`, `mixerId`, `productId`) VALUES (a,b,c,d);
IF d < 6 THEN
SET d = d + 1;
ELSE
SET d = 1;
end if;
SET b = b + 1;
SET v1 = v1 + 1;
END WHILE;
END $$
delimiter ;
auto_increment를 적용할 수 있도록 하려면 삽입 목록에 포함하지 마십시오.
drop procedure if exists p;
delimiter $$
CREATE PROCEDURE p()
BEGIN DECLARE v1 INT DEFAULT 1;
DECLARE a INT DEFAULT 1; #autoIncrement
DECLARE b INT DEFAULT 1; #counting upwards
DECLARE c INT DEFAULT 1; #only 1 mixer
DECLARE d INT DEFAULT 1; #product from 1-6
WHILE v1 < 10 DO
INSERT INTO `settingsoperationmixer`(`settingsOperationId`, `mixerId`, `productId`) VALUES (b,c,d);
IF d < 6 THEN
SET d = d + 1;
ELSE
SET d = 1;
end if;
SET b = b + 1;
SET v1 = v1 + 1;
END WHILE;
END $$
delimiter ;
drop table if exists `settingsoperationmixer`;
create table `settingsoperationmixer`
(`settingsOperationMixerId` int auto_increment primary key ,`settingsOperationId` int, `mixerId` int, `productId` int)
;
call p();
MariaDB [sandbox]> select * from `settingsoperationmixer`;
+--------------------------+---------------------+---------+-----------+
| settingsOperationMixerId | settingsOperationId | mixerId | productId |
+--------------------------+---------------------+---------+-----------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 3 | 1 | 3 |
| 4 | 4 | 1 | 4 |
| 5 | 5 | 1 | 5 |
| 6 | 6 | 1 | 6 |
| 7 | 7 | 1 | 1 |
| 8 | 8 | 1 | 2 |
| 9 | 9 | 1 | 3 |
+--------------------------+---------------------+---------+-----------+
9 rows in set (0.00 sec)
t(a, b, c)에 삽입하여 seq_0_to_63에서 seq%6+1, seq+1,1을 선택합니다.
언급URL : https://stackoverflow.com/questions/49576361/mysql-while-loop-to-fillup-table-with-incremental-values-where-auto-increment-is
반응형
'programing' 카테고리의 다른 글
시간 초과와 함께 모듈 '하위 프로세스' 사용 (0) | 2022.10.11 |
---|---|
함수 인수로 단일 파이프 '|'를 사용하는 기능 (0) | 2022.10.11 |
Windows 또는 Linux를 검출하고 있습니까? (0) | 2022.10.11 |
아나콘다 업데이트 방법 (0) | 2022.10.02 |
데이터 없는 MySql 내보내기 스키마 (0) | 2022.10.02 |